Linux 2.6.12的内核,mips CPU, /dev/目录下mtd字符设备只能挂载7个的问题。

时间:2022-03-20 11:17:58
Linux 2.6.12的内核,mips CPU, /dev/目录下mtd字符设备只能挂载7个的问题。
nor flash分区数:
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 01800000 00020000 "rootfs"
mtd1: 00280000 00020000 "vmlinux"
mtd2: 00100000 00020000 "config1"
mtd3: 00100000 00020000 "config2"
mtd4: 00100000 00020000 "config3"
mtd5: 00100000 00020000 "config4"
mtd6: 00080000 00020000 "splash"
mtd7: 00000080 00020000 "mactype"
mtd8: 00040000 00020000 "feature"

# ls /dev/mtd* -al
crwxr-xr-x    1 nobody   nobody    90,   0 Mar  2  2009 /dev/mtd0
crwxr-xr-x    1 nobody   nobody    90,   2 Mar  2  2009 /dev/mtd1
crwxr-xr-x    1 nobody   nobody    90,   4 Mar  2  2009 /dev/mtd2
crwxr-xr-x    1 nobody   nobody    90,   6 Mar  2  2009 /dev/mtd3
crwxr-xr-x    1 nobody   nobody    90,   8 Mar  2  2009 /dev/mtd4
crwxr-xr-x    1 nobody   nobody    90,  10 Mar  2  2009 /dev/mtd5
crwxr-xr-x    1 nobody   nobody    90,  12 Mar  2  2009 /dev/mtd6
brwxr-xr-x    1 nobody   nobody    31,   0 Mar  2  2009 /dev/mtdblock0
brwxr-xr-x    1 nobody   nobody    31,   1 Mar  2  2009 /dev/mtdblock1
brwxr-xr-x    1 nobody   nobody    31,   2 Mar  2  2009 /dev/mtdblock2
brwxr-xr-x    1 nobody   nobody    31,   3 Mar  2  2009 /dev/mtdblock3
brwxr-xr-x    1 nobody   nobody    31,   4 Mar  2  2009 /dev/mtdblock4
brwxr-xr-x    1 nobody   nobody    31,   5 Mar  2  2009 /dev/mtdblock5
brwxr-xr-x    1 nobody   nobody    31,   6 Mar  2  2009 /dev/mtdblock6
crwxr-xr-x    1 nobody   nobody    90,   1 Mar  2  2009 /dev/mtdr0
crwxr-xr-x    1 nobody   nobody    90,   3 Mar  2  2009 /dev/mtdr1
crwxr-xr-x    1 nobody   nobody    90,   5 Mar  2  2009 /dev/mtdr2
crwxr-xr-x    1 nobody   nobody    90,   7 Mar  2  2009 /dev/mtdr3
crwxr-xr-x    1 nobody   nobody    90,   9 Mar  2  2009 /dev/mtdr4
crwxr-xr-x    1 nobody   nobody    90,  11 Mar  2  2009 /dev/mtdr5
crwxr-xr-x    1 nobody   nobody    90,  13 Mar  2  2009 /dev/mtdr6

如何修改驱动?让后面的两个分区
mtd7: 00000080 00020000 "mactype"
mtd8: 00040000 00020000 "feature"
也在/dev/目录下出现设备名?

10 个解决方案

#1


#define MAX_MTD_DEVICES 32 /* 我改了这个宏,原来是16,编译后,还是没有出现/dev/mtd7, /dev/mtd8 */
当然,要是改成4,那/dev/目录会出现mtd0 到 mtd3共4个字符设备。

查阅了devices.txt文档:
90 char        Memory Technology Device (RAM, ROM, Flash)
                  0 = /dev/mtd0                First MTD (rw)
                  1 = /dev/mtdr0        First MTD (ro)
                    ...
                 30 = /dev/mtd15        16th MTD (rw)
                 31 = /dev/mtdr15        16th MTD (ro)

应当支持多个>= 7个mtd设备啊?文当里都标出了 /dev/mtd15.


#2


楼主用mkmod手动建立对应的mtd7,mtd8,如果可以用就是表示udev脚本没建立,如果不可以用检查分区源码配置,看源码应该不难的

如:
90, 14 /dev/mtd7
90, 16 /dev/mtd8 

还有注意的地方,看看的你flash的实际容量跟分区的地址容量是不是一至

#3


mknod /dev/mtd7 c 90 14; chmod 755 /dev/mtd7

我手工建议设备mtd7,然后cat /dev/mtd7显示没有mtd7设备:
# ls -al /dev/mtd7
crwxr-xr-x    1 nobody   nobody    90,  14 Jul  3  2009 /dev/mtd7
# cat /dev/mtd7
cat: /dev/mtd7: No such device or address

#4


引用 2 楼 hefuhua 的回复:
楼主用mkmod手动建立对应的mtd7,mtd8,如果可以用就是表示udev脚本没建立,如果不可以用检查分区源码配置,看源码应该不难的

如:
90, 14 /dev/mtd7
90, 16 /dev/mtd8

还有注意的地方,看看的你flash的实际容量跟分区的地址容量是不是一至

分区肯定没问题,我仔细核对过。
udev脚本没建立? 如何建立,请说说细路,谢谢。

#5


http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=628054&page=&view=&sb=&o=&fpart=all&vc=1

我在这里找到udev的介绍。
当然现在的系统是嵌入式系统,rootfs里没有对应的/etc/udev/rules.d/目录,要重做rootfs文件系统?

#6


引用 3 楼 wenxy1 的回复:
mknod /dev/mtd7 c 90 14; chmod 755 /dev/mtd7

我手工建议设备mtd7,然后cat /dev/mtd7显示没有mtd7设备:
# ls -al /dev/mtd7
crwxr-xr-x    1 nobody   nobody    90,  14 Jul  3  2009 /dev/mtd7
# cat /dev/mtd7
cat: /dev/mtd7: No such device or address


这个说明是驱动udev脚本建立没有问题,因为只要/dev/mtd7是有效的udev脚本会建立的,因为你手动建立也没成功,
所以是驱动本身有问题

我还是怀疑mtd分区表的那个数组大小跟你的flash大小没对上,导致后面没有实际的flash分区引起的,或者你分区的
多少块分区没有正确的传给mtd驱动

看看别人碰到这问题没有

#7


引用 5 楼 wenxy1 的回复:
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=628054&page=&view=&sb=&o=&fpart=all&vc=1

我在这里找到udev的介绍。
当然现在的系统是嵌入式系统,rootfs里没有对应的/etc/udev/rules.d/目录,要重做rootfs文件系统?


这个的前提是你mknod手动是成功的,再修正udev脚本

#8



/* broadcom 97403的开发板,mips CPU,linux kernel 2.6.12, 32 MB nor flash */
static struct mtd_partition bcm9XXXX_parts[] = 
{
{ name: "rootfs",    offset: 0,  size: 24576 * 1024 }, // 24576KB
{ name: "vmlinux",  offset: 0x01D00000, size: 2560 * 1024},
{ name: "config1",   offset: 0x01800000, size: 1024 * 1024},
{ name: "config2",   offset: 0x01900000, size: 1024 * 1024},
{ name: "config3",   offset: 0x01A00000, size: 1024 * 1024},
{ name: "config4",   offset: 0x01B00000, size: 1024 * 1024},

{ name: "splash", offset: 0x01C80000, size: 512 * 1024}, 
//{ name: "cfe", offset: 0x01C80000, size: 512*1024 },
//{ name: "macadr",  offset: 0x01FFF800, size: 144 },
//{ name: "nvram",   offset: 0x01FFF890, size: 1904-128 },
{ name: "mactype",  offset: 0x01FFF780, size: 128 },
{ name: "feature",  offset: 0x01F80000, size: 256 * 1024 } // 256 * 1024
};


编译kernel后,用新kernel启动,由于没有mtd7,mtd8这两个设备,我手工创建:
mknod /dev/mtd7 c 90 14; chmod 755 /dev/mtd7; chown nobody:nobody /dev/mtd7
mknod /dev/mtd8 c 90 16; chmod 755 /dev/mtd8; chown nobody:nobody /dev/mtd8

然后检查能没能访问:
# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 01800000 00020000 "rootfs"
mtd1: 00280000 00020000 "vmlinux"
mtd2: 00100000 00020000 "config1"
mtd3: 00100000 00020000 "config2"
mtd4: 00100000 00020000 "config3"
mtd5: 00100000 00020000 "config4"
mtd6: 00080000 00020000 "splash"
mtd7: 00000080 00020000 "mactype"
mtd8: 00040000 00020000 "feature"
# cat mtd7
***1234567890123457V01.01.001-2008-07-22-17:14:*** //内容我做了编辑。

用这种方法,似乎解决了问题。
谢谢。过一下再看看。

#9


确认,已搞定,多谢hefuhua.

#10


兄弟你的MIPS cpu用的什么norflash,我的怎么都不可以用,我的nor地址是1fc00000,用的sst的芯片,要是mtd中没有是不是还要添加芯片读写程序啊?能不能共享点经验,306612305@qq.com

#1


#define MAX_MTD_DEVICES 32 /* 我改了这个宏,原来是16,编译后,还是没有出现/dev/mtd7, /dev/mtd8 */
当然,要是改成4,那/dev/目录会出现mtd0 到 mtd3共4个字符设备。

查阅了devices.txt文档:
90 char        Memory Technology Device (RAM, ROM, Flash)
                  0 = /dev/mtd0                First MTD (rw)
                  1 = /dev/mtdr0        First MTD (ro)
                    ...
                 30 = /dev/mtd15        16th MTD (rw)
                 31 = /dev/mtdr15        16th MTD (ro)

应当支持多个>= 7个mtd设备啊?文当里都标出了 /dev/mtd15.


#2


楼主用mkmod手动建立对应的mtd7,mtd8,如果可以用就是表示udev脚本没建立,如果不可以用检查分区源码配置,看源码应该不难的

如:
90, 14 /dev/mtd7
90, 16 /dev/mtd8 

还有注意的地方,看看的你flash的实际容量跟分区的地址容量是不是一至

#3


mknod /dev/mtd7 c 90 14; chmod 755 /dev/mtd7

我手工建议设备mtd7,然后cat /dev/mtd7显示没有mtd7设备:
# ls -al /dev/mtd7
crwxr-xr-x    1 nobody   nobody    90,  14 Jul  3  2009 /dev/mtd7
# cat /dev/mtd7
cat: /dev/mtd7: No such device or address

#4


引用 2 楼 hefuhua 的回复:
楼主用mkmod手动建立对应的mtd7,mtd8,如果可以用就是表示udev脚本没建立,如果不可以用检查分区源码配置,看源码应该不难的

如:
90, 14 /dev/mtd7
90, 16 /dev/mtd8

还有注意的地方,看看的你flash的实际容量跟分区的地址容量是不是一至

分区肯定没问题,我仔细核对过。
udev脚本没建立? 如何建立,请说说细路,谢谢。

#5


http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=628054&page=&view=&sb=&o=&fpart=all&vc=1

我在这里找到udev的介绍。
当然现在的系统是嵌入式系统,rootfs里没有对应的/etc/udev/rules.d/目录,要重做rootfs文件系统?

#6


引用 3 楼 wenxy1 的回复:
mknod /dev/mtd7 c 90 14; chmod 755 /dev/mtd7

我手工建议设备mtd7,然后cat /dev/mtd7显示没有mtd7设备:
# ls -al /dev/mtd7
crwxr-xr-x    1 nobody   nobody    90,  14 Jul  3  2009 /dev/mtd7
# cat /dev/mtd7
cat: /dev/mtd7: No such device or address


这个说明是驱动udev脚本建立没有问题,因为只要/dev/mtd7是有效的udev脚本会建立的,因为你手动建立也没成功,
所以是驱动本身有问题

我还是怀疑mtd分区表的那个数组大小跟你的flash大小没对上,导致后面没有实际的flash分区引起的,或者你分区的
多少块分区没有正确的传给mtd驱动

看看别人碰到这问题没有

#7


引用 5 楼 wenxy1 的回复:
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=628054&page=&view=&sb=&o=&fpart=all&vc=1

我在这里找到udev的介绍。
当然现在的系统是嵌入式系统,rootfs里没有对应的/etc/udev/rules.d/目录,要重做rootfs文件系统?


这个的前提是你mknod手动是成功的,再修正udev脚本

#8



/* broadcom 97403的开发板,mips CPU,linux kernel 2.6.12, 32 MB nor flash */
static struct mtd_partition bcm9XXXX_parts[] = 
{
{ name: "rootfs",    offset: 0,  size: 24576 * 1024 }, // 24576KB
{ name: "vmlinux",  offset: 0x01D00000, size: 2560 * 1024},
{ name: "config1",   offset: 0x01800000, size: 1024 * 1024},
{ name: "config2",   offset: 0x01900000, size: 1024 * 1024},
{ name: "config3",   offset: 0x01A00000, size: 1024 * 1024},
{ name: "config4",   offset: 0x01B00000, size: 1024 * 1024},

{ name: "splash", offset: 0x01C80000, size: 512 * 1024}, 
//{ name: "cfe", offset: 0x01C80000, size: 512*1024 },
//{ name: "macadr",  offset: 0x01FFF800, size: 144 },
//{ name: "nvram",   offset: 0x01FFF890, size: 1904-128 },
{ name: "mactype",  offset: 0x01FFF780, size: 128 },
{ name: "feature",  offset: 0x01F80000, size: 256 * 1024 } // 256 * 1024
};


编译kernel后,用新kernel启动,由于没有mtd7,mtd8这两个设备,我手工创建:
mknod /dev/mtd7 c 90 14; chmod 755 /dev/mtd7; chown nobody:nobody /dev/mtd7
mknod /dev/mtd8 c 90 16; chmod 755 /dev/mtd8; chown nobody:nobody /dev/mtd8

然后检查能没能访问:
# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 01800000 00020000 "rootfs"
mtd1: 00280000 00020000 "vmlinux"
mtd2: 00100000 00020000 "config1"
mtd3: 00100000 00020000 "config2"
mtd4: 00100000 00020000 "config3"
mtd5: 00100000 00020000 "config4"
mtd6: 00080000 00020000 "splash"
mtd7: 00000080 00020000 "mactype"
mtd8: 00040000 00020000 "feature"
# cat mtd7
***1234567890123457V01.01.001-2008-07-22-17:14:*** //内容我做了编辑。

用这种方法,似乎解决了问题。
谢谢。过一下再看看。

#9


确认,已搞定,多谢hefuhua.

#10


兄弟你的MIPS cpu用的什么norflash,我的怎么都不可以用,我的nor地址是1fc00000,用的sst的芯片,要是mtd中没有是不是还要添加芯片读写程序啊?能不能共享点经验,306612305@qq.com