How to add multi partition for SD/MMC card in Linux Driver
之所以写这个,是因为,在这个过程中,自己明显感觉到了,做事情一定要有一定的方法,方法对了,
事情做的才有效率,否则就是事倍功半。
【过程】
当前,Linux下sd/mmc卡的驱动已经实现。需要在此基础上实现,给这个mmc/sd块设备加多个分区。
有人会问,那等系统启动后,通过fdisk工具去分区不也可以吗?回答是,除了我对此fdisk工具不熟悉之外,本身sd/mmc驱动加载后,只有一个区,而我tootfs就是放在sd卡中,然后kernel 通过sd挂载rootfs的,所以,系统启动后,sd卡处于使用中,好像fdisk对于已经使用的sd卡进行分区,估计也会有些问题的。
所以,就需要在驱动加载过程中,加入多个分区。然后我后期向卡的不同的分区去写东西,就很方便了。
言归正传。此处,如果通过NFS启动kernel和rootfs,然后启动后,插入卡,可以显示类似如下信息(4GB的SD卡):
mmc0: new SDHC card at address d555
mmcblk0: mmc0:d555 SD04G 3.79 GiB
mmcblk0: p1
如果里面的分区被破坏,就会这样(这个是1G的SD卡):
mmc0: new high speed SD card at address b368
mmcblk0: mmc0:b368 UD 952 MiB
mmcblk0: unknown partition table
现在要做的,就是对其支持多分区,但是,关于如何对于sd卡里面加多分区,去百度google了,结果是除了这个帖子里:
“Check Setup
After rebooting and inserting a SD card you should have a device file like:
/dev/mmcblk0
And a partition on it:
/dev/mmcblk0p1 ”
让人明白,mmcblk0就是mmc block 0和mmcblk0p1就是mmc block 0 partition 1之外,其他的可以说是一无所获,所以,只能去通过上面的信息,搞清楚到底何时去加的/dev/mmcblk0p1,然后在对应的地方
加上自己要的多分区。
不过,具体是什么地方输出这些信息的,自己去mmc驱动里面,一直无法找到。而且mmc驱动只是针对host controller而言的,而这些信息输出是在卡插上的时候,识别了卡的之后,才能显示具体信息的。
不过,在mmc驱动至少能知道,大概信息,就是在这些函数里面:
mmc_rescan -> mmc_attach_sd - -> mmc_add_card() ->device_add() ->
然后在device_add里面,太多相关的系统函数kobject_add,blocking_notifier_call_chain,device_create_file,device_create_file,device_create_sys_dev_entry,device_add_class_symlinks,device_add_attrs,bus_add_device,device_pm_add,bus_attach_device,。。。。。
所以,实现没法搞清楚,具体是哪个函数具体去实现的底层加了/dev/mmcblk0p1这个节点的。
继续debug,加打印信息,在插入卡后,出现:
# mmc0: new SDHC card at address d555
--SD-- 1
--SD-- 2
--SD-- 3
--SD-- 4
--SD-- 6
--SD-- 7
--SD-- 8
--SD-- 1
--SD-- 9
--SD-- 1
--SD-- 10
mmcblk0: mmc0:d555 SD04G 3.79 GiB
--SD-- 1
--SD-- 2
--SD-- 3
--SD-- 4
--SD-- 5
--SD-- 6
--SD-- 7
--SD-- 8
--SD-- 1
--SD-- 9
--SD-- 1
--SD-- 10
--SD-- 11
--SD-- 12
mmcblk0: p1
--SD-- 1
--SD-- 2
--SD-- 3
--SD-- 4
--SD-- 5
--SD-- 6
--SD-- 7
--SD-- 8
--SD-- 1
--SD-- 9
--SD-- 1
--SD-- 10
--SD-- 11
--SD-- 12
--SD-- 1
--SD-- 2
--SD-- 3
--SD-- 4
--SD-- 6
--SD-- 7
--SD-- 8
--SD-- 1
--SD-- 9
--SD-- 1
--SD-- 10
--SD-- 11
--SD-- 12
--SD-- 11
--SD-- 12
所以,由:
--SD-- 10
mmcblk0: mmc0:d555 SD04G 3.79 GiB
判断是
bus_attach_device(dev);
if (paren