VxWorks 7 如何将寄存器地址映射到虚拟地址

goalie高义 2021-09-04 09:44:40

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,并没有读到寄存器的默认值。

请各位帮忙看看程序是哪里出了问题,如何正确映射物理地址到虚拟地址。

祝好。

...全文
1620 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
goalie高义 2021-09-04
  • 打赏
  • 举报
回复

上面那个没有成功,现在用了devMemLib里面的接口(devMemCreate、devMemOpen)。已经可以把物理地址映射成虚拟地址了。
现在可以用DKM程序控制IO翻转了,算是应用控制寄存器的接口调通了
下一步调试EIM寄存器来和模块进行通信

2,184

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧