sxwglxq 发表于 2005-10-27 11:27:46

如何操作external i/o bank?

大牛们:我的4510 external i/o bank0接了一片CPLD,在uclinux应用程序里如何让CPLD和4510通信?开发包里有没有现成的驱动?没有的话,不写专门的驱动,在应用程序怎么操作地址和数据?没搞过,提十一下,谢了。

lumit-support-1 发表于 2005-10-27 21:02:06

定义一下外部IO的地址及数据总线宽度,然后就可以操作了!和功能寄存器差不多的!!
可以看看4510的手册!!

sxwglxq 发表于 2005-10-29 15:34:25

楼上的,0x3ff3010(EXTDBWTH)在应用程序里不能赋值,一旦出险赋值语句,程序一运行,板子就死了.
#define urefextcon (*(volatile unsigned char *) 0x3ff3038)
#define uextacon0 (*(volatile unsigned char *) 0x3ff3008)
#define uextacon1 (*(volatile unsigned char *) 0x3ff300c)
#define udatawidth (*(volatile unsigned char *) 0x3ff3010)
...
udatawidth=udatawidth | 0x00f00000;
//urefextcon=0x0ce2983fd;
//uextacon0=0x0FFFFFFF;
//uextacon1=0x0FFFFFFF;
fprintf(stderr,"%x\t%x\t%x\t%x\n",urefextcon,uextacon0,uextacon1,udatawidth);
如果注释掉udatawidth=udatawidth | 0x00f00000;运行结果0   0   0   56
打开注释,编译运行板子就死,这是什么原因?有知道的提示一下,先谢了.

lumit-support-1 发表于 2005-10-29 18:58:17

你的程序在ADS下可以调试通过了吗??最好在ADS下调试通过了,再在系统上进行试验!!还有一般应该定义成volatile unsigned的吧,因为这些寄存器都是32位的啊!!

rootlinger 发表于 2005-10-30 09:46:43

:oops:

rootlinger 发表于 2005-10-30 10:17:55

uClinux没有mmu,是实地址模式,所以直接对extio bank0 的实际地址进行读写及可,驱动可有可无,我个人认为,不知道各位大侠,有啥新的见解? :lol:

rootlinger 发表于 2005-10-30 10:23:13

uClinux没有mmu,是实地址模式,所以直接对extio bank0 的实际地址进行读写及可,驱动可有可无,我个人认为,不知道各位大侠,有啥新的见解? :lol:

sxwglxq 发表于 2005-10-30 11:01:40

同意楼上的观点。但有个问题,操作extio bank0 地址之前,现要设几个于此相关控制寄存器,在应用程序里,一设寄存器,板子就死。

rootlinger 发表于 2005-10-30 12:53:12

恩,对于uclinux而言 ,你要对extio bank 0 操作, 它的地址为 0X3fd00000开头,你直接操作就可以,不用设置相关控制寄存器. uclinux给你设置好了,你直接用就可以了 :lol:

rootlinger 发表于 2005-10-30 12:59:15

对于寄存器的操作,你在ADS 下,调试,会更直接明了

sxwglxq 发表于 2005-10-30 15:24:44

感谢楼上的回复.
首先我个人认为external bank 0的地址不是从0x3fd0000开始的.原因是uclinux开发包里有个头文件hardware.h是这样的
/************************************************/
/* DRAM Refresh & External I/O Control Register */
/************************************************/
#define ExtIOBase        (0x360<<0)
#define VSF                (0x1<<15)
#define REN                (0x1<<16)
#define tCHR                (0x0<<17)
#define tCSR                (0x0<<20)
#define RefCountValue        ((2048+1-(16*fMCLK))<<21)
#define rREFEXTCON        (RefCountValue|tCSR|tCHR|REN|VSF|ExtIOBase)
应该是从0x3600000开始的
第二,在我的程序里:
#define CPLD (*(volatile unsigned char *) 0x3600003)
...
CPLD=0x11;
fprintf(stderr,"%x\n",CPLD);
运行结果显示CPLD为零.这是为何?
我原来也认为external bank 0的地址是从0x3fd0000开始的,一运行死机,改成从0x3600000开始,不死机了,只是值不对.
第三,就是我把hardware.h里的相应设置改了一下,编译连接完了发现修改过的又被恢复了,这怎么回事?
先谢了!

rootlinger 发表于 2005-10-31 08:20:28

hardware.h 文件里,有个设置extio的数据宽度和禁止的地方,那个地方也应该修改。
页: [1]
查看完整版本: 如何操作external i/o bank?