Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1165971
  • 博文数量: 173
  • 博客积分: 4048
  • 博客等级:
  • 技术积分: 2679
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 18:53
文章分类

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: 嵌入式

2012-03-29 16:04:24

nios可以使用mmu对内存进行分页管理。
nios没有IO指令,但在mmu上io地址和数据地址有所区分。如图



因此如果在驱动程序中需要进行IO,则要将地址与0XE0000000进行或运算。
例如led的地址为0X08000000。
则写数据语句为:

点击(此处)折叠或打开

  1. outl(0xffffff,0x08000000 | 0xe0000000);


mmu转换的物理地址如下:


物理低地址512M空间与虚拟地址中的I/O和kernel段对应,其虚拟地址对应物理地址为:
kernel: 0xC0000000~0xDFFFFFFF -> 0x00000000~0x1FFFFFFF
I/O:    0xE0000000~0xFFFFFFFF -> 0x80000000~0x9FFFFFFF
最高位为1表示cache bypass,直接访问地址。
低地址也是可以通过MMU中TLB进行地址转换的,因此也可以使用ioremap进行io

点击(此处)折叠或打开

  1. void *led_base=ioremap(0x08000000,4);
  2. iowrite32(0xffffff,led_base);



阅读(2245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~