作者Trai (Trai)
看板LinuxDev
标题[问题] 使用mmap在arm linux上存取physical adderss的问题
时间Sat Dec 30 11:01:31 2006
我希望能在arm linux中直接存取soc版子以已经定义好的
memroy map I/O 像是led 7-setment等等,但是因为使用linux
所以程式无法直接去存取这些physical address。
找到的方法是利用/dev/mem来存取physical address,并使用mmap
来map到要存取的记忆体位置到user space,目前的结果是map的过程
没有问题,成功传回可用的指标,但是将其值读出後发现似乎有点问题
所读出的值都是0,这是蛮奇怪的结果,但是我不知道原因出在哪里,
不知道是否有人有过类似的经验能够分享一下。我用的版子是新华的
preSoc Creator。
谢谢~~^^
=========================================================
不好意思 我可能提供太少资讯了 多谢大大提醒
根据manual 上提供的资料
led 位在 0x30000000 offset 为 0x0c04
下面是程式片断 仅把比较关键列出来,错误处理省略
#define BASE = 0x30000000
#define OFFSET = 0x0c04
int fd;
unisgned char *mem;
fd = open("/dev/mem", O_RDWR | O_SYNC);
mem = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
fd,BASE);
//到这里都成功,判断mem 值也非-1
我使用下面的叙述来查看记忆体的内容
printf("%x",*(mem+OFFSET));
大致上是这样
程序很简单 这是我找到最容易达到目标的方式
但是却不知道为何读不到正确的physical address
谢谢^^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.89.1
※ 编辑: Trai 来自: 140.113.89.1 (12/30 11:05)
1F:推 fumin:问问题要学着提供足够的资讯 12/30 11:15
※ 编辑: Trai 来自: 140.113.89.1 (12/30 11:43)
2F:→ Trai:谢谢提醒^^ 12/30 11:43
3F:推 tseng1129:请用ioremap来转换实体与虚拟记忆体的对映 12/30 13:00
4F:推 roylee17:printf("%x",*(volatile*)(mem+OFFSET)); 试试有用吗? 12/30 13:38
5F:推 fish39:新华那块是直接用实体位址,不用再ioremap了 12/30 21:32
6F:推 fumin:很可能是r兄说的volatile的问题 12/30 22:40
7F:→ Trai:谢谢各位 我使用volatile 实验之後 还是无法读取到正确的值 12/31 10:39
8F:→ Trai:*(volatile unsigned short *)(mem+offset) //程式改为这样 12/31 10:40
9F:→ Trai://读出来仍然全都是0 12/31 10:42
10F:→ Trai:不过我试着去读取BASE = 0x10000000前面一点的位址 可以读到ꨠ 12/31 10:42
11F:→ Trai:非零值 我在想会不会是位址使用错误了 但这个位址是新华档案 12/31 10:43
12F:→ Trai:里面定义的 他的程式单纯在arm上面跑 的确使用此位址 12/31 10:43
※ 编辑: Trai 来自: 140.113.89.1 (12/31 10:45)
13F:推 NcThoR:S3C2410齁... 01/02 02:42