设备树之emmc驱动移植

硬件设备: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

<think>好的,用户想了解如何在Linux内核中配置EMMC驱动设备树,将8GB的EMMC分成两个各4GB的分区。我需要结合提供的引用内容来组织回答。首先,根据引用[2],emmc驱动修改涉及分区表,可能需要调整设备树中的分区定义。引用[3]提到uboot中的命令,可能涉及分区操作。然后,用户需要创建两个4G分区,这涉及到设备树中的分区节点设置,如修改分区大小参数。可能还需要调整内核配置,确保EMMC驱动支持。最后,要验证分区是否正确挂载。需要分步骤说明,包括设备树修改、驱动确认、分区格式化和验证。同时生成相关问题,比如如何调整分区大小、设备树驱动的交互等。</think>在Linux内核中配置EMMC驱动设备树实现双分区需要以下步骤: ### 一、设备树(DTS)配置 1. **定位EMMC设备节点** 在设备树文件中(如`arch/arm/boot/dts/your_board.dts`),找到EMMC控制器节点,通常标记为`mmc@xxxxx`。例如: ```dts &mmc0 { status = "okay"; bus-width = <8>; max-frequency = <200000000>; // 分区定义 partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; partition@0 { label = "partition1"; reg = <0x00000000 0x10000000>; // 起始地址0,大小4GB(0x10000000字节) }; partition@1 { label = "partition2"; reg = <0x10000000 0x10000000>; // 起始地址4GB,大小4GB }; }; }; ``` 2. **关键参数说明** - `reg`属性定义了分区的起始地址和大小,使用十六进制表示。例如,`0x10000000`对应十进制$4 \times 1024^3 = 4294967296$字节。 - 需确保总分区大小不超过EMMC容量(通过引用[2]可知需先确认EMMC设备号为`mmcblk0`或`mmcblk1`)。 ### 二、内核驱动适配 1. **确认EMMC驱动支持** 检查内核配置选项`CONFIG_MMC`和`CONFIG_MMC_SDHCI`是否启用,确保EMMC控制器驱动已编译(参考引用[2]中驱动移植方法)。 2. **更新分区表解析** Linux内核通过设备树中的`fixed-partitions`兼容性标识解析静态分区表,驱动会自动注册分区为`/dev/mmcblk0p1`和`/dev/mmcblk0p2`[^2]。 ### 三、操作验证 1. **烧写与挂载** 使用`fdisk -l /dev/mmcblk0`查看分区,应显示两个4GB分区。通过以下命令格式化并挂载: ```bash mkfs.ext4 /dev/mmcblk0p1 mkfs.ext4 /dev/mmcblk0p2 mount /dev/mmcblk0p1 /mnt/part1 ``` 2. **启动脚本配置** 在`/etc/fstab`中添加自动挂载项,确保系统启动时加载分区(引用[3]中uboot命令需与内核启动参数一致)。 ### 四、注意事项 - 若EMMC已包含引导程序(如uboot),需保留引导分区空间(通常在起始地址预留4MB)。 - 动态调整分区需结合工具如`parted`,但设备树定义的静态分区更适用于嵌入式固定场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值