강좌 & 팁
이번에는 mmc host driver 가 등록되는 과정을 한번 보겠습니다.
mmc 드라이버는 세가지 형태를 지원합니다.
sd, mmc, sdio
그리고 블록 장치가 등록이 되죠.
버스가 등록이 되어 해당 장치를 사용할수 있게 해주고
mmc block 장치가 등록되어 파일시스템과 연결이 되는 통로가 되게 됩니다.
각각의 등록과정을 보면
mmc core 에서 호출되는 mmc_init 함수가 불리워집니다.
2910 static int __init mmc_init(void)
2911 {
2912 int ret;
2913
2914 workqueue = alloc_ordered_workqueue("kmmcd", 0);
2915 if (!workqueue)
2916 return -ENOMEM;
2917
2918 mmc_of_reserve_idx();
2919
2920 ret = mmc_register_bus();
2921 if (ret)
2922 goto destroy_workqueue;
2923
2924 ret = mmc_register_host_class();
2925 if (ret)
2926 goto unregister_bus;
2927
2928 ret = sdio_register_bus();
2929 if (ret)
2930 goto unregister_host_class;
2931
2932 return 0;
2933
2934 unregister_host_class:
2935 mmc_unregister_host_class();
2936 unregister_bus:
2937 mmc_unregister_bus();
2938 destroy_workqueue:
2939 destroy_workqueue(workqueue);
2940
2941 return ret;
2942 }
여기에서 mmc bus, host class, sdio bus 가 각각 등록이 됩니다.
여기까지는 mmc 의 host 가 등록이 되게 되어 있죠
앞으로 디바이스가 등록이 될때 bus type 이 mmc 혹은 sdio 일 경우
mmc host 에 등록이 되겠죠.
또하나의 init 이 불리워지는데 mmc block 입니다.
drivers/mmc/card/block.c
2484 static int __init mmc_blk_init(void)
2485 {
2486 int res;
2487
2488 if (perdev_minors != CONFIG_MMC_BLOCK_MINORS)
2489 pr_info("mmcblk: using %d minors per device\n", perdev_minors);
2490
2491 max_devices = 256 / perdev_minors;
2492
2493 res = register_blkdev(MMC_BLOCK_MAJOR, "mmc");
2494 if (res)
2495 goto out;
2496
2497 res = mmc_register_driver(&mmc_driver);
2498 if (res)
2499 goto out2;
2500
2501 return 0;
2502 out2:
2503 unregister_blkdev(MMC_BLOCK_MAJOR, "mmc");
2504 out:
2505 return res;
2506 }
mmc block 이 등록이 되는 간단한!!! 드라이버입니다.
블록장치가 하나 등록이 되죠?
mmc block 의 major 는 179번으로 등록됩니다.
mmc driver 가 하나 등록이 되는는 것으로 끝나네요
중요하게 보게될 자료구조는 아래 파일들입니다.
include/linux/mmc/card.h
include/linux/mmc/host.h
글이 쓸데없이 소스때문에 길지만
cpu 에 등록되어 있는 장치가 등록되는 과정은 다음에 보도록 하겠습니다.