硬件设备:itop4412开发板 内核版本linux-3.8.1
设备树方式减少了设备的冗余编码,同时使移植变得更加高效。eMMC作为开发板的基础,十分重要。
设备树用的是内核自带的smdk4412.dts
vim arch/arm/boot/dts/exynos4412-smdk4412.dts
在设备树中添加如下代码:
87 ldo22_reg: LDO22 {
88 regulator-name = "VMEM_VDD_2.8V";
89 regulator-min-microvolt = <2800000>;
90 regulator-max-microvolt = <2800000>;
91 maxim,ena-gpios = <&gpk0 2 1>;
92 };
146 mmc@12550000 {
147 compatible = "samsung,exynos4412-dw-mshc";
148 reg = <0x12550000 0x1000>;
149 interrupts = <0 77 0>;
150 #address-cells = <1>;
151 #size-cells = <0>;
152 fifo-depth = <0x80>;
153 clocks = <&clock 301>, <&clock 149>;
154 clock-names = "biu", "ciu";
155 num-slots = <1>;
156 broken-cd;
157 non-removable;
158 card-detect-delay = <200>;
159 vmmc-supply = <&ldo22_reg>;
160 clock-frequency = <400000000>;
161 samsung,dw-mshc-ciu-div = <0>;
162 samsung,dw-mshc-sdr-timing = <2 3>;
163 samsung,dw-mshc-ddr-timing = <1 2>;
164 pinctrl-0 = <&sd4_clk &sd4_cmd &sd4_bus4 &sd4_bus8>;
165 pinctrl-names = "default";
166 status = "okay";
167 bus-width = <8>;
168 cap-mmc-highspeed;
169 };
在驱动中增加设备属性匹配:
vim drivers/mmc/host/dw_mmc-exynos.c
221 static const struct of_device_id dw_mci_exynos_match[] = {
222 { .compatible = "samsung,exynos4412-dw-mshc",},
223 { .compatible = "samsung,exynos5250-dw-mshc",
224 .data = &exynos5250_drv_data, },
225 {},
226 };
make menuconfig 配置emmc内核驱动
编译烧写进开发板后启动会出现错误:
mmc1: unrecognised EXT_CSD revision 7
解决方法:将296行的6改为7
vim drivers/mmc/core/mmc.c
295 /* amended by cqx:6->7 */
296 if (card->ext_csd.rev > 7) {
297 pr_err("%s: unrecognised EXT_CSD revision %d\n",
298 mmc_hostname(card->host), card->ext_csd.rev);
299 err = -EINVAL;
300 goto out;
301 }
重新编译后烧写入开发板,启动打印如下信息说明emmc驱动移植成功。
mmcblk0: mmc1:0001 4YMD3R 3.64 GiB
mmcblk0boot0: mmc1:0001 4YMD3R partition 1 4.00 MiB
mmcblk0boot1: mmc1:0001 4YMD3R partition 2 4.00 MiB
mmcblk0: p1 p2 p3 p4
mmcblk0boot1: unknown partition table
mmcblk0boot0: unknown partition table
mmc0: mmc_rescan_try_freq: trying to init card at 1562500 Hz
mmc0: new high speed SD card at address 0260
使用fdisk -l命令查看详细信息
Disk /dev/mmcblk0: 3909 MB, 3909091328 bytes
226 heads, 33 sectors/track, 1023 cylinders
Units = cylinders of 7458 * 512 = 3818496 bytes
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 653 1020 1372272 c Win95 FAT32 (LBA)
/dev/mmcblk0p2 6 287 1051578 83 Linux
/dev/mmcblk0p3 288 569 1051578 83 Linux
/dev/mmcblk0p4 570 652 309507 83 Linux
Partition table entries are not in disk order
Disk /dev/mmcblk0boot1: 4 MB, 4194304 bytes
4 heads, 16 sectors/track, 128 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk /dev/mmcblk0boot1 doesn't contain a valid partition table
Disk /dev/mmcblk0boot0: 4 MB, 4194304 bytes
4 heads, 16 sectors/track, 128 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk /dev/mmcblk0boot0 doesn't contain a valid partition table
Disk /dev/mmcblk1: 1992 MB, 1992294400 bytes
4 heads, 16 sectors/track, 60800 cylinders
Units = cylinders of 64 * 512 = 32768 bytes