使用自己做的am3358板子,ti sdk 8.0,gpmc的cs0接nand,dts配置之后,linux能够正常运行,
能够挂载nand上的ubi文件系统,但是读gpmc_config7_0的值与配置的不一样。
下面是dts中的配置:
&gpmc {
status = "okay";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&nandflash_pins_default>;
pinctrl-1 = <&nandflash_pins_sleep>;
ranges = <0 0 0x08000000 0x10000000>; /* CS0: NAND */
nand@0,0 {
reg = <0 0 0>; /* CS0, offset 0 */
下面是linux起来后,读出的寄存器值:
Arago 2015.02 am335x-evm /dev/ttyO0
am335x-evm login: root
root@am335x-evm:~# devmem2 0x50000078
/dev/mem opened.
Memory mapped at address 0xb6f51000.
Read at address 0x50000078 (0xb6f51078): 0x00000F41
root@am335x-evm:~#
此外,当我在gpmc的cs1上配置了另外的设备后,gpmc_config7_0还是0x00000f41,而gpmc_config7_1是和
我设置的参数一致的。两个设备的dts配置如下:
&gpmc {
status = "okay";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&nandflash_pins_default>;
pinctrl-1 = <&nandflash_pins_sleep>;
ranges = <0 0 0x08000000 0x10000000 /* CS0: NAND */
1 0 0x18000000 0x1000000 /* CS1: dual_business 16M*/
>;
nand@0,0 {
reg = <0 0 0>; /* CS0, offset 0 */
…….
nor@1,0 {
#address-cells = <1>;
#size-cells = <1>;
reg = <1 0 0x1000000>; /* CS1, offset 0 */
linux起来后,读出的值如下:
root@am335x-evm:~#root@am335x-evm:~# devmem2 0x50000078
/dev/mem opened.
Memory mapped at address 0xb6f19000.
Read at address 0x50000078 (0xb6f19078): 0x00000F41
root@am335x-evm:~# devmem2 0x500000a8
/dev/mem opened.
Memory mapped at address 0xb6fe3000.
Read at address 0x500000A8 (0xb6fe30a8): 0x00000F58
请问下:
1、是不是我的配置哪里不对呢?
2、nand配置中“reg = <0 0 0>; /* CS0, offset 0 */”是不是需要改成“reg = <0 0 0x10000000>; /* CS0, offset 0 */” ?
3、gpmc挂两个设备后,当我访问(读/写)了cs1的地址后,再读/写nand上的文件系统时,会出错,信息如下:
root@am335x-evm:~# rmmod dualram_dev.ko
[ 693.100338] UBI warning: ubi_io_read: error -74 (ECC error) while reading 176 bytes from PEB 45:55712, read only 176 bytes, retry
[ 693.113791] UBI warning: ubi_io_read: error -74 (ECC error) while reading 176 bytes from PEB 45:55712, read only 176 bytes, retry
[ 693.126891] UBI warning: ubi_io_read: error -74 (ECC error) while reading 176 bytes from PEB 45:55712, read only 176 bytes, retry
[ 693.139917] UBI error: ubi_io_read: error -74 (ECC error) while reading 176 bytes from PEB 45:55712, read 176 bytes
[ 693.150868] CPU: 0 PID: 1208 Comm: sh Tainted: G O 3.14.26-g07d13c6-dirty #7
[ 693.159164] Backtrace:
[ 693.161759] [<c0011268>] (dump_backtrace) from [<c0011404>] (show_stack+0x18/0x1c)
[ 693.169690] r6:dda9b000 r5:000000b0 r4:ffffffb6 r3:00000000
[ 693.175638] [<c00113ec>] (show_stack) from [<c04ba7f0>] (dump_stack+0x20/0x28)
(说明:我输入命令ls/sync/lsmod等,都可能出现上面这种现象。)
谢谢!
reg = <0 0 0>; /* CS0, offset 0 */
Jian Zhou:
CS1上接的是什么设备呢?另外CS0上的NAND的dts是按照TI SDK的dts修改的么?
QingKai Ji1:
回复 Jian Zhou:
Jian Zhou:您好!
CS1上接的是个双口RAM(IDT 70T3339)。
CS0上的nand是按照ti sdk的am335x-evm.dts修改的(主要是修改了分区部份,时序这些都没改)。
谢谢!
QingKai Ji1:
回复 QingKai Ji1:
看sdk8.0的内核代码,gpmc这块,对于nand的地址分配,似乎是直接按照默认的16M配置的,
并没有使用dts中ranges参数;而对于普通的gpmc设备,会使用dts中的ranges参数重新配置
(gpmc_cs_remap)。是吗?
Jian Zhou:
回复 QingKai Ji1:
gpmc连接nand的这部分驱动不要改动,因为涉及到Linux系统内存分配的问题。在NAND空间分配的基础上,给SRAM分配地址空间。
QingKai Ji1:
回复 Jian Zhou:
Jian Zhou:您好!
你是指的“ranges = <0 0 0x08000000 0x10000000 /* CS0: NAND */”不改吧?
这样的话,我新增加的设备(我需要增加多个设备)地址空间在0x08000000之前和
0x18000000之后分配都可以吧,地址空间和片选号间有没有限制?
(如小的片选,地址空间要求用小的地址空间之类)
谢谢!
Jian Zhou:
回复 QingKai Ji1:
新增加的设备,要在CS0之后的空间分配,不能在之前的空间分配。
QingKai Ji1:
回复 Jian Zhou:
Jian Zhou:您好!
我现在一共要用到5个片选,一个异步nand,另外4个是同步双口RAM。其中两个16M,
两个64M。我现在有以下问题:
1、我们新增设备可以用的地址空间,只能是0x1800 0000到0x1FFF FFFF吗?
2、你提到的linux系统地址空间分配是需要0x0800 0000到0x17FF FFFF,这是用于什么的呢?
3、cs0接的nand的地址空间是否能修改,象我现在5个设备的情况,应该如何分配地址空间?
谢谢!
Jian Zhou:
回复 QingKai Ji1:
cs0 NAND的地址空间不要做修改,剩下的4个设备,在NAND占用空间之后分配就可以。
QingKai Ji1:
回复 Jian Zhou:
Jian Zhou:您好!
nand地址空间不修改,能说下原因吗?内核代码中,gpmc这块,nand的实际配置的
地址空间是:0x0100 0000到0x01FF FFFF。
如果新增的设备只能用0x1800 0000之后的地址空间,不能满足我们的地址空间要求。
我们需要64M * 2 + 16M * 2的地址空间,而0x1800 0000之后只有128M地址空间了。
谢谢!
QingKai Ji1:
回复 QingKai Ji1:
Jian Zhou:您好!
我看到你在这个帖子里面说的:“对NAND的访问分个最小的CS空间即可,只要保证CS使能就可”,
不知道如何理解?
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/85755.aspx
谢谢!