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

goalie高义 goalie高义 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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

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

祝好。

...全文

相关推荐

嵌入式系统/ARM技术中的VxWorks中的地址映射

嵌入式系统/ARM技术中的VxWorks地址映射在通信系统设计开发中起着关键作用。VxWorks默认情况下,为内存、板控制状态寄存器(bcsr)、PCMCIA基地址、内部存储器和Flash存储器等核心

weixin_38689338

MPC885 MMU与TLB机制深度解析:从寄存器操作到性能优化实战

内存管理单元(MMU)是现代处理器实现虚拟内存、内存保护和高效地址转换的核心硬件模块。其核心原理是通过页表将程序使用的虚拟地址映射到物理内存地址,而转换后备缓冲区(TLB)作为页表的高速缓存,直接决定了地址转换的性能。在嵌入式系统,尤其是运行复杂操作系统(如VxWorks、Linux)的场景中,MMU与TLB的配置与管理至关重要,它确保了系统的可靠性、安全性和实时性。对于像NXP MPC885这类PowerQUICC系列通信处理器,其MMU架构提供了独立的指令与数据TLB、硬件辅助的页表遍历、TLB锁定以及

weixin_30689307

MPC8640 MMU vxworks理解

. **52位虚拟地址** - 包含虚拟段ID和页索引。7. **页表** - 使用页索引查找虚拟页号。8. **物理地址** - 通过物理页号和页内偏移确定。

qingfengtsing

VxWorks中怎么从Flash BOOT

不同版本的BootRom可能有不同的引导需求或限制,因此需要确保BootRom能够识别并正确加载VxWorks内核。7.

hehedexiaodajiahao

vxworks任务管理

在任务切换时不需要进行虚拟地址空间的切换,因为不存在用户态和核心态的区分,从而减少了上下文切换的开销。3.

AndyWQS
评论 1
收藏 已收藏
分享
返回顶部
goalie高义
VxWorks 2,187 成员 2,913 内容