2,184
社区成员




Hi all,
最近在调试VxWorks的驱动,一款Intel并口总线的模块,使用imx6q芯片的EIM总线进行通信(3地址线、8位数据线、RD、WR、CE)。
但是手上的VxWorks内核没有支持EIM的驱动,但是本人对VxWorks驱动不熟悉,想通过DKM程序直接访问设置寄存器的方式来实现EIM接口的配置。
由于有MMU的存在,这就涉及到物理地址和虚拟地址直接的映射问题。
我首先尝试了一下通过配置GPIO寄存器来控制IO电平翻转来验证地址映射,但是失败了,IO没有反应。
我的程序如下:
#define IMX6Q_IOMUXC_BASE 0x20E0000
#define REG_MUX_CTL_GPIO_0 0x220
#define REG_PAD_CTL_GPIO_0 0x5F0
#define REG_MUX_CTL_GPIO_1 0x224
#define REG_PAD_CTL_GPIO_1 0x5F4
static VIRT_ADDR gpioVirtAddr;
static void ioMuxInit(void)
{
PHYS_ADDR iomuxPhyAddr = IMX6Q_IOMUXC_BASE;
VIRT_ADDR iomuxVirtAddr;
int psize = vmPageSizeGet();
/*初始化管脚功能*/
if((iomuxVirtAddr = (VIRT_ADDR)memalign(psize, psize * 2)) == NULL)
{
perror("memalign null");
}
/*物理地址到虚拟地址映射(不确定是不是用这个函数)*/
if(vmMap(NULL, iomuxVirtAddr, iomuxPhyAddr, (psize * 2)) == ERROR)
{
perror("vmMap");
}
/*设置GPIO0、1为普通GPIO*/
*(VIRT_ADDR *)(iomuxVirtAddr + REG_MUX_CTL_GPIO_0) = 0x00000005;
*(VIRT_ADDR *)(iomuxVirtAddr + REG_PAD_CTL_GPIO_0) = 0x0001b0b0;
*(VIRT_ADDR *)(iomuxVirtAddr + REG_MUX_CTL_GPIO_1) = 0x00000005;
*(VIRT_ADDR *)(iomuxVirtAddr + REG_PAD_CTL_GPIO_1) = 0x0001b0b0;
/*初始化IO方向和电平*/
PHYS_ADDR gpioPhyAddr = 0x209C000;
if((gpioVirtAddr = (VIRT_ADDR)memalign(psize, psize * 2)) == NULL)
{
perror("gpioVirtAddr memalign");
}
if(vmMap(NULL, gpioVirtAddr, gpioPhyAddr, (psize * 2)) == ERROR)
{
perror("gpioVirtAddr vmMap");
}
*(VIRT_ADDR *)(gpioVirtAddr + 0x4) = 0x3; /*设置GPIO0、1为普通方向为输出*/
*(VIRT_ADDR *)(gpioVirtAddr + 0x0) = 0x0; /*电平为低电平*/
printf("finish\n");
}
void start(void) {
ioMuxInit(); //初始化io状态
while(1)
{
*(VIRT_ADDR *)(gpioVirtAddr + 0x0) = 0x0; //低电平
sleep(1);
*(VIRT_ADDR *)(gpioVirtAddr + 0x0) = 0x3; //高电平
sleep(1);
}
}
程序能够正常运行,本意是一秒翻转一次IO电平,但是IO没有任何反应。
感觉应该是地址映射还是有问题,我映射完之后通过printf打印地址的内容,读出来的值为0,并没有读到寄存器的默认值。
请各位帮忙看看程序是哪里出了问题,如何正确映射物理地址到虚拟地址。
祝好。
上面那个没有成功,现在用了devMemLib里面的接口(devMemCreate、devMemOpen)。已经可以把物理地址映射成虚拟地址了。
现在可以用DKM程序控制IO翻转了,算是应用控制寄存器的接口调通了
下一步调试EIM寄存器来和模块进行通信