15 内核里控制IO口

内核里控制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) &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值