LINUX下如何访问硬件内存地址

yuchongjike 2010-03-25 11:33:42
在LINUX下如何访问一个硬件的内存数据?(不是写驱动程序,我只需要读写一个指定的内存地址就行)
例如:串口1的内存地址0x400, 串口2的内存地址0x402,USB的内存地址:0xD03C0000

看了书上介绍的,用ioremap映射,然后用ioreadx读取即可,但我在编译的时候提示未定义这两个函数.
这两个函数的头文件,书上介绍的是在asm/io.h里面,但我的asm/ 没有这个文件.只有sys/才有这个文件,但也没定义这两个函数
...全文
498 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuchongjike 2010-03-30
  • 打赏
  • 举报
回复
Open()后
lseek()
read()
write()
用这几个就可以读出来了.
yuchongjike 2010-03-26
  • 打赏
  • 举报
回复
已解决:
open("/dev/mem",O_RDWR);
lkncjy 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yuchongjike 的回复:]
已解决:
open("/dev/mem",O_RDWR);
[/Quote]

没试过在应用程序那里读哦,楼主是怎么解决的?open()是打开设备的吧。
lkncjy 2010-03-26
  • 打赏
  • 举报
回复
哦,不好意思,我以为是在驱动程序那里读,原来是在应用程序那里。。呵呵
cybernik 2010-03-26
  • 打赏
  • 举报
回复
用mmap
yuchongjike 2010-03-26
  • 打赏
  • 举报
回复
我的程序如下:

#include <stdio.h>
#include <asm/io.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;

int main()
{
BYTE bReg = 0x00;
DWORD dwAddr = ioremap(0x400,256); //0x400是串口的内存地址

printf(" 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");
printf(" --------------------------------------------\n");
for(int y=0;y<0x10;y++)
{
printf("%02X: ",y<<4);
for(int i=0;i<0x10;i++)
{
bReg = y*0x10+i;
printf("%02X ",readb(dwAddr+bReg));
}
printf("\n");
}
iounmap(dwAddr);
}
yuchongjike 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lkncjy 的回复:]
用__raw_writel(v,a),__raw_readl(v,a)函数
[/Quote]
编设时还是提示未定义此函数
qihuanfengyun 2010-03-25
  • 打赏
  • 举报
回复
哦,学习了!!!
yuchongjike 2010-03-25
  • 打赏
  • 举报
回复
我用的是PC+Fedora12系统.
在/usr/src/kernels/2.6.18-92.e15-xen-i686/include下的asm里面有定义
我把这个里面的asm,asm-generic,linux目录都创建了一个链接放在了/usr/include下,并#include <asm/io.h>了
编译的时候不提示找不到文件了,但还是提示ioremap,readb,iounmap未声明
lkncjy 2010-03-25
  • 打赏
  • 举报
回复
用__raw_writel(v,a),__raw_readl(v,a)函数
lkncjy 2010-03-25
  • 打赏
  • 举报
回复
用__raw_writel(v,a),__raw_readl(a)函数
Wenxy1 2010-03-25
  • 打赏
  • 举报
回复
根据你的硬件平台,从而确定io.h的位置.
例如在mips平台, 2.6.18 kernel:

include\asm-mips\io.h
/*
* ioremap - map bus memory into CPU space
* @offset: bus address of the memory
* @size: size of the resource to map
*
* ioremap performs a platform specific sequence of operations to
* make bus memory CPU accessible via the readb/readw/readl/writeb/
* writew/writel functions and the other mmio helpers. The returned
* address is not guaranteed to be usable directly as a virtual
* address.
*/
#define ioremap(offset, size) \
__ioremap_mode((offset), (size), _CACHE_UNCACHED)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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