SEED-DVS DM6467的评估板,CS3片选0x44000000开始的32M地址空间
CPLD主要完成开关量控制,板上部分外设的逻辑控制等.扩展至CS3空间,使用时需要将CS3空间配置为16bits异步模式.
这个我已经配置了,代码如下:
#define PINMUX *(unsigned int*)IO_ADDRESS(0x01c40000)
static int mycpld_init(void) {
int err = 0;
unsigned int *EMIFA_A2CR;
/*这里是将CS3片选空间(0x44000000)设置为了16bits异步模式*/
PINMUX &= 0xfffffff8;/*设置为EMIFA模式*/
EMIFA_A2CR = (unsigned int *)ioremap_nocache(0x20008014,4);/*取出片选3的异步配置寄存器的地址*/
*(volatile unsigned int *)EMIFA_A2CR = 0x3ffffffd;/*使用正常模式(禁用频闪模式),禁用等待,且选择16bits总线模式*/
iounmap(EMIFA_A2CR);
/*PINMUX0中配置,使能ATA*/
PINMUX|=0x1;//enable ata;
return err;
}
已知0x44000010这个地址上bit0~bit3分别控制led1~led4
并且led3和led4是自定义可编程的LED灯,LED1和LED2对应键盘输入板的LED
我现在要控制LED3和LED4亮灭,如下:
我现在很简单的在init函数中测试一下LED灯能否点亮,如下:
LED = (unsigned short*)ioremap_nocache(0x44000010, 4);
while(count > 0)
{
(*(volatile unsigned short*)LED)&= ~(1<<3);
msleep(1000);
(*(volatile unsigned short*)LED)&= ~(1<<2);
msleep(1000);
(*(volatile unsigned short*)LED)|= (1<<3);
msleep(1000);
(*(volatile unsigned short*)LED)|= (1<<2);
msleep(1000);
count–;
}
iounmap(LED);
可是驱动放在板子上LED3和LED4并没有反应,请问这是怎么回事?是不是那里配置还有问题?
Chris Meng:
你好,
能否在内核态里面直接f访问寄存器,看你的配置是否正确?
jason lu:
回复 Chris Meng:
不能直接操作这块寄存器地址,控制LED的寄存器地址为0x44000010
而这块地址空间在片选3上,是CPLD模块实现的.
内核不能够直接操作.也就是说,如下操作绝对是错误的:
*(volatile unsigned int *)0x44000010 &= ~(1<<3);