如何在驱动中正确读写内存地址

[复制链接]
查看11 | 回复7 | 2021-1-27 06:46:14 | 显示全部楼层 |阅读模式
具体情况是这样的:
我想做一个DSP与ARM之间的HPI接口驱动,DSP是5410,ARM是2410,DSP的HCS引脚接ARM的nGCS1引脚,因此在驱动中对HPI相关的配置寄存器操作就相当于访问0x8000000开始的的128M空间(BANK1),我不是很清楚在驱动中如何正确访问地址范围内某个特定地址,看文档好像是要使用ioremap,然后使用ioread8,iowrite8,最后iounmap,但是没有示例代码可以看,所以不知道具体是怎么使用的,请教各位这种情况下如何正确访问,谢谢
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
ioremap后,返回的就是0x8000000的虚拟地址,直接像操作指针那样就可以访问了
回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
引用1楼xianfengdesign的回复:ioremap后,返回的就是0x8000000的虚拟地址,直接像操作指针那样就可以访问了
谢谢楼上的回复,直接解引用就可以吗?
比如:
virtual=ioremap(actual);
*virtual=1000;
就可以吗?
回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
可以,但不能兼容所有平台。还是使用ioread/iowrite这组函数,方便以后移植
回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
呵呵,这个刚好我做过,看你想要怎么做,是做用户态的,还是要写驱动。
用户态这样
intfd;
unsignedlongaddr;
addr=0x8000000;
fd=open("/dev/mem",O_RDWR);
mapaddr=(unsignedlong)mmap(0,
8*1024*1024,
PORT_READ|PORT_WRITE,
MAP_SHARED,
fd,
addr);
得出的mapaddr就是你硬件0x8000000;地址哦映射地址。
你对mapaddr操作就可以的了。操作HPIA,HPID,HPIC,只要在mapaddr上加上分别的偏移地址就好了

回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
跟操作指针类似,要注意的是地址映射方式。
回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
高手呀...
回复

使用道具 举报

千问 | 2021-1-27 06:46:14 | 显示全部楼层
感觉4楼的不对,mmap系统调用需要内核filp_>mmap()指针函数的支持。只有内核filp->mmap指针函数实现的时候才可以用mmap系统调用。楼主要用这个系统调用,首先要实现这个指针函数。
我觉得:如果楼主不需要频繁访问128M内存时,就直接用ioremap建立虚拟地址与物理地址影射就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行