vxworks6.7下怎么把驱动程序添加到bsp中

vxworks6.7下怎么把驱动程序添加到bsp中,第1张

vxWorks6.x以后,原则上是不需要也不应该把驱动添加到bsp中去,可以这样讲,引入vxWorks6.x就是为了解决这个问题,bsp中通用驱动太多。驱动都是放在target/src/hwif这个目录里的,然后把驱动写成vxBus类型,在config。h或者workbench中加入相应的组件来加入驱动,当然驱动需要的参数,如基地址,中断等等信息是放在hwconf.c文件中,vxworks6.x以后的驱动应该这样去加. 如果不是vxBus的驱动话,最简单的办法就是 把你的驱动放在bsp目录下,然后再sysLib.c中加入这个文件即可,如 include "xxxx.c"

这一问题来自项目中一个实际的需求:

我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致。

举个例子:

寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是在uboot中设置,现在我想在Linux运行后,读出改寄存器的值,再来检查该寄存器是否与uboot的配置一致。

Linux应用程序运行的是虚拟空间,有没有什么机制可以是完成我提到的这一需求。若行,还请附些测试代码。

谢谢!

这个需要用mmap()函数将寄存器物理地址映射为用户空间的虚拟地址,即将寄存器的那段内存映射到用户空间,函数介绍如下:

void* mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset)

该函数映射文件描述符 fd 指定文件的 [offset, offset + len] 物理内存区至调用进程的 [addr, addr + len] 的用户空间虚拟内存区,通常用于内存共享或者用户空间程序控制硬件设备,函数的返回值为最后文件映射到用户空间的地址,进程可直接 *** 作该地址。下面是测试代码(仅供参考):

#define DDR2_REG_BASE (0x20000000)

#define MAP_SIZE 4096UL

#define MAP_MASK (MAP_SIZE - 1)

static unsigned int pTestRegBase

static int dev_fd

dev_fd = open("/dev/mem", O_RDWR | O_NDELAY)

if (dev_fd <</SPAN>0) {

LOGE("open(/dev/mem) failed.")

return

}

pTestRegBase = (void *)mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dev_fd,DDR2_REG_BASE &~MAP_MASK)

if (MAP_FAILED == pTestRegBase) {

printf("mmap failed. fd(%d), addr(0x%x), size(%d)\n", dev_fd, DDR2_REG_BASE, MAP_SIZE)

} else {

unsigned int reg_value = *((volatile unsigned int *)(pTestRegBase + 10))

printf("reg_value = 0xx\n", reg_value)

munmap((void*)pTestRegBase, MAP_SIZE)

}

pTestRegBase = 0

if(dev_fd)

close(dev_fd)

这里将DDR2_REG_BASE开始大小为1个page的物理地址映射到了用户空间,然后就可以用pTestRegBase作为起始地址 *** 作寄存器了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11959814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存