内核里控制IO口
在linux内核里mmu已经启用,不能直接访问物理地址,必须要把物理地址映射到一个虚拟地址上,然后通过该虚拟地址来访问原物理地址。
相关函数:
void *ioremap(cookie, size) //用于把指定的物理地址映射到一个虚拟地址上
//cookie用于指定要映射的物理地址,size表示映射的大小范围
//返回值为映射得到的虚拟地址
iounmap(void *addr) //用于取消虚拟地址的映射关系
ioread8(地址)/readb() //读地址上的8位值,readb是比较老的函数
ioread16(地址)/readw() //读地址上的16位值
ioread32(地址)/readl() //读32位值
iowrite8(值, 地址)/writeb //把8位的值写到指定的地址上,writeb是比较老的函数
iowrite16(值, 地址)/writew //把16位的值写到指定的地址上
iowrite32(值, 地址)/writel //把32位的值写到指定的地址上
事例代码(控制板子上的LED灯亮灭)(xxx.c):
#include <linux/init.h>
#include <linux/module.h>
#include <asm/io.h>
#define BASE_DDR 0x01c20800 //基地址
#define PA_CFG1_OFFSET 0x04 //PA组IO口的功能配置寄存器1对基地址偏移为4字节
#define PA_DATA_OFFSET 0x10 //PA组IO口的数据寄存器对基地址偏移为0x10字节
u8 *vaddr;//用于记录映射得到的虚拟地址
static int __init myled_init(void)
{
u32 val;
vaddr = ioremap(BASEDDR, SZ_4K); //映射寄存器的基地址到一个虚拟地址上
val = ioread32(vaddr+PA_CFG1_OFFSET) &