嵌入式开发者社区

标题: 如何指定emmc的设备名为/dev/mmcblk0 [打印本页]

作者: wgy504    时间: 2017-5-23 13:21
标题: 如何指定emmc的设备名为/dev/mmcblk0
我是在使用bbb板子,内核是3.8.13。遇到问题的现象是:sd卡和emmc要同时使用,但是文件系统要放在emmc中。这样,我起初设计环境变量uEnv.txt是“mmcroot=/dev/mmcblk1p2 ro”,但是当sd卡出了问题的时候,或者忘记插卡的时候,板子重新启动就无法找到文件系统啦!
           我现在处理这个问题的思路是:修改设备树《am33xx.dtsi》:
aliases {
  serial0 = &uart1;
  serial1 = &uart2;
  serial2 = &uart3;
  serial3 = &uart4;
  serial4 = &uart5;
  serial5 = &uart6;
  mmc0 = &mmc2;      //这两项是我后加上的
  mmc1 = &mmc1;      //
};
。。。。。。
mmc2: mmc@481d8000 {
   compatible = "ti,omap3-hsmmc";   
   ti,hwmods = "mmc2";   
   ti,needs-special-reset;   
   ti,needs-special-hs-handling;   
   dmas = <&edma 2   
    &edma 3>;   
   dma-names = "tx", "rx";   
   status = "disabled";  
  };   
  mmc1: mmc@48060000 {   
   compatible = "ti,omap3-hsmmc";   
   ti,hwmods = "mmc1";   
   ti,dual-volt;   
   ti,needs-special-reset;   
   ti,needs-special-hs-handling;   
   dmas = <&edma 24   
    &edma 25>;   
   dma-names = "tx", "rx";   
   status = "disabled";  
   };  
  mmc3: mmc@47810000 {   
   compatible = "ti,omap3-hsmmc";   
   ti,hwmods = "mmc3";   
   ti,needs-special-reset;   
   ti,needs-special-hs-handling;   
   status = "disabled";  
   };
我的目的是想让系统启动后,把emmc注册为/dev/mmcblk0设备,这样我就可以把环境变量uEnv.txt设置为“mmcroot=/dev/mmcblk0p2 ro”,不管设备有没有检测到sd卡,emmc的设备名称都不会被修改,就可以解决这个问题了。
但是我这么修改之后,重新编译内核及设备树,替换了板子中相关的zImage和am335x-boneblack.dtb文件后,板子重新上电(板子有sd卡),emmc设备名还是/dev/mmcblk1。
请问,我怎么修改才可以保证不管设备有没有检测到sd卡,emmc的设备名称都不会被修改啊???


作者: human    时间: 2017-5-23 18:04
创龙的AM335x开发板就可以把文件系统固化到eMMC
作者: wgy504    时间: 2017-5-23 18:07
我知道,我也已经把文件系统固化到了emmc中了,你仔细看看我的问题。谢谢,
作者: vefone    时间: 2017-5-24 00:15
wgy504 发表于 2017-5-23 18:07
我知道,我也已经把文件系统固化到了emmc中了,你仔细看看我的问题。谢谢, ...

uboot中默认应该是找不到sd卡的文件系统,自动切换挂载emmc的文件系统。我们使用比较新的uboot(2016-05)和内核(4.4.12),不会存在上述问题。按楼主的思路,改动起来会有点大。我们这边也没办法帮忙验证
作者: wgy504    时间: 2017-5-24 08:58
谢谢您提供的思路,我刚才移植了uboot(2016-05)和内核(4.4.12)及sdk中的文件系统,我想请教您,uboot中的哪部分代码实现了您说的那样“uboot中默认应该是找不到sd卡的文件系统,自动切换挂载emmc的文件系统。”,多谢啦!比较着急,新版本的uboot没有深入研究过。
作者: wgy504    时间: 2017-5-24 09:55
vefone 发表于 2017-5-24 00:15
uboot中默认应该是找不到sd卡的文件系统,自动切换挂载emmc的文件系统。我们使用比较新的uboot(2016-05 ...

我把新的uboot,内核及新的文件系统下载到sd卡中了,从sd卡启动,系统可以正常启动。但是我按照你说的意思测试了一下,把这个文件系统放在了emmc中,删除了sd卡里的第二个分区的文件系统,系统并没有向你说的那样,检测不到sd卡里的文件系统就从emmc的文件系统启动啊!
下面是从串口打印出来的启动信息
U-Boot SPL 2016.05-00230-g120a8a3-dirty (May 10 2017 - 12:55:37)
Trying to boot from MMC1
reading args
spl_load_image_fat_os: error reading image args, err - -1
reading u-boot.img
reading u-boot.img
reading u-boot.img
reading u-boot.img


U-Boot 2016.05-00230-g120a8a3-dirty (May 10 2017 - 12:55:37 +0800)

       Watchdog enabled
I2C:   ready
DRAM:  512 MiB
NAND:  0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
reading uboot.env

** Unable to read "uboot.env" from mmc0:1 **
Using default environment

<ethaddr> not set. Validating first E-fuse MAC
Net:   eth0: ethernet@4a100000
Warning: usb_ether MAC addresses don't match:
Address in SROM is         de:ad:be:ef:00:01
Address in environment is  50:72:24:b7:2e:17
, eth1: usb_ether
Press SPACE to abort autoboot in 2 seconds
switch to partitions #0, OK
mmc0 is current device
SD/MMC found on device 0
reading boot.scr
** Unable to read file boot.scr **
reading uEnv.txt
** Unable to read file uEnv.txt **
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
reading /am335x-boneblack.dtb
36841 bytes read in 11 ms (3.2 MiB/s)
switch to partitions #0, OK
mmc0 is current device
SD/MMC found on device 0
switch to partitions #0, OK
mmc0 is current device
SD/MMC found on device 0
reading boot.scr
** Unable to read file boot.scr **
reading uEnv.txt
** Unable to read file uEnv.txt **
** File not found /boot/zImage **
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
switch to partitions #0, OK
mmc1(part 0) is current device
SD/MMC found on device 1
switch to partitions #0, OK
mmc1(part 0) is current device
SD/MMC found on device 1
reading boot.scr
** Unable to read file boot.scr **
reading uEnv.txt
26 bytes read in 4 ms (5.9 KiB/s)
Loaded env from uEnv.txt
Importing environment from mmc1 ...
3664216 bytes read in 231 ms (15.1 MiB/s)
36841 bytes read in 52 ms (691.4 KiB/s)
Kernel image @ 0x82000000 [ 0x000000 - 0x37e958 ]
## Flattened Device Tree blob at 88000000
   Booting using the fdt blob at 0x88000000
   Loading Device Tree to 8fff4000, end 8fffffe8 ... OK

Starting kernel ...

[    0.000377] clocksource_probe: no matching clocksources found
[    0.000555] WARNING: Your 'console=ttyO0' has been replaced by 'ttyS0'
[    0.000560] This ensures that you still see kernel messages. Please
[    0.000565] update your kernel commandline.
[    0.554364] omap_voltage_late_init: Voltage driver support not added
[    0.785565] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[    0.798767] ---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

一直卡在这里了
作者: vefone    时间: 2017-5-24 21:47
wgy504 发表于 2017-5-24 09:55
我把新的uboot,内核及新的文件系统下载到sd卡中了,从sd卡启动,系统可以正常启动。但是我按照你说的意 ...

你的uboot环境参数有问题
作者: wgy504    时间: 2017-5-25 09:18
vefone 发表于 2017-5-24 21:47
你的uboot环境参数有问题

谢谢回复,那应该设置成什么样的参数,才能保证“不管有没有sd卡,系统都能可以正确的找到文件系统啊?”因为现在系统里有sd卡和没有sd卡,emmc的设备号就像我问题中描述的那样是不一样的!(有sd的时候,sd的设备号是/dev/mmcblk0,emmc是/dev/mmcblk1;  没有sd的时候,emmc的设备是/dev/mmcblk0)
作者: wgy504    时间: 2017-6-18 17:07
暂时没有找到从根本上解决这个问题的方法:现在的处理办法是:将sd卡分成两个分区,在第一个分区中把环境变量文件uEnv.txt制定文件系统挂载路径为/dev/mmcblk1p2,同时,在emmc的启动分区中也有一个环境变量/dev/mmcblk0p2。这样如果有sd卡,就到/dev/mmcblk1p2(emmc)中读取文件系统;如果没有sd卡就到/dev/mmcblk0p2(emmc)中读取文件系统。
但是还没有找到根本性的解决这个问题:
我认为应该想办法把emmc的设备名改为/dev/mmcblk0,这样不管有没有sd卡,都会正确地去emmc中读取文件系统了。

我在创龙的板子上也做了实验,如果插一张空的卡就一直停在starting kernel,也是启动不了内核和文件系统的。。。

希望有知道的高手看到帖子后能够给点建议
作者: vefone    时间: 2017-8-10 23:24
wgy504 发表于 2017-6-18 17:07
暂时没有找到从根本上解决这个问题的方法:现在的处理办法是:将sd卡分成两个分区,在第一个分区中把环境变 ...

固定节点名,需要修改内核mmc底层驱动




欢迎光临 嵌入式开发者社区 (https://51dsp.net/) Powered by Discuz! X3.4