我自已在写mini2440上的LED驱动。但我发现,写入GPBDAT口的值,和随后从中读取的值不相等啊。
这样,会出很多问题啊,从GPBDAT口读取的值,和led灯亮的情况不匹配,根本不能反应灯亮的情况。但是我写入的值,和随后灯亮的情况倒是吻合的。代码如下,不长,只花你们一分种。 这是为什么呢,希望能得倒你们工程师的回答。
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP 0x56000018
#define SETGPBOUT 0x15400 //010101010000000000 用来设输出模式
#define SETGPBIN 0x0 //000000000000000000用来设输入模式
.........................
//获得i/o内存
request_mem_region(GPBCON,4,"sss");
request_region(GPBDAT,1,"ooo");
//向GPB data口写入值,oxffff
void *datAddr=ioremap(GPBDAT,4);
void *conAddr=ioremap(GPBCON,4);
__raw_writel(SETGPBOUT, conAddr);
__raw_writel(0Xffff,datAddr); //注意,这里写入的是0xffff,LED灯全部被关掉。说明写入的值能正确控制灯。
//取得GPB data口的值
__raw_writel(SETGPBIN, conAddr);
unsigned long tmpvalue=__raw_readl(datAddr);
printf("value=%d\n"); //这里不是打印的oxffff, 而是一个变化的值,比如0x7fe
release_region(GPBDAT,1);
release_mem_region(GPBCON,4