강좌 & 팁
mmc 드라이버에 관한 마지막 입니다.
mmc 뿐만 아니라 SDIO 도 있지만 그건 다음에 보기로 하구요
mmc 인터페이스의 장치로 호출되는 연결점은 mmc_blk_issue_rq 이었습니다.
이 함수는 파티션 초기화 시에 만들어지는 queue thread 에서 실행된다고 햇었죠.
mmc 블록의 초기화 시에 실행되는 thread 입니다.
결론적으로 장치에 대한 접근은 바로 이곳에서 시작이 됩니다.
request 의 처리에 대한 호출은 4가지 타입으로 이루어져 있습니다.
mmc_blk_issue_secdiscard_rq
: secure 관련된 부분과 erase 를 수행하는 군요... 거의 안쓰이는 것 같습니다.
mmc_blk_issue_discard_rq
: 구체적으로 쓰이는 경우는 모르겠지만 erase 를 수행합니다. 버린 다는 것이니....
주로 format 시에 쓰이더군요
mmc_blk_issue_flush
: mmc 장치에 flush 명령을 내려줍니다. 장치가 갖고 있는 cache 된 데이타(?) 를 비우라는 것인듯...
보면 umount 할때나 뭐 암튼 그럴때 불리더군요
mmc_blk_issue_rw_rq
: 하나의 read 혹은 write 명령을 수행하는 부분입니다.
좀 복잡해 보이기는 하지만 코드를 보시면 request 요청에 대해
내부에서 사용할 mmc block reqeust 자료형을 하나 선언하고
그에 따른 형식을 채워서 (mmc_blk_rw_rq_prep) 전송을 하게 됩니다 (mmc_start_req)
당연히 전송시에 에러가 없다면 block 에 report 를 하게 되고(__blk_end_request)
에러가 있다면 재전송 혹은 실패로 처리를 하게 됩니다.
실패에 따른 재전송 시에는 장치를 한번 reset 하는 과정을 거치죠.
실패를 하게 되면 실패에 따른 리포트를 역시 하게 됩니다.
생각보다 마지막에 보게되느 장치에서의 queue 처리 thread 함수는 의외로 간단한 구조입니다.
물론 이 상위 레이어에서 하위레이어로 내려가게 되면 실질적인 데이타 전송 프로토콜과 장치 드라이버로
접근하게 됩니다만 그것까지 언급할 필요는 없을 듯하네요
다섯번에 걸쳐 mmc 장치가 어떻게 동작하는지 보았는데 아직 커널 4.0 stable 버전이 안나왔군요
4.0 릴리즈는 되었습니다만 꽤 오래 걸리네요
역시 큰 숫자가 바뀌는건 작은 일이 아닌가 봅니다.