一、linux驱动开发-1.3-LED实验

目录

一、前言       

1.1、地址映射

1.1.1、ioremap

1.1.2、iounmap

1.2、IO内存访问函数

1.2.1、读操作

1.2.2、写操作

二、驱动程序编写

三、测试程序编写

四、测试


一、前言       

        前面用一个虚拟的chrdevbase设备做了一个字符设备的开发,现在编写一个真正的linux字符设备-led。重点即是linux下引脚控制驱动。在此先了解一下MMU(内存管理单元),

        MMU的主要功能:

        ①、完成虚拟空间到物理空间的映射;

        ②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性;

       linux内核启动后会初始化MMU,设置好内存映射,设置好后CPU访问的都是虚拟地址。获取实际硬件寄存器物理地址在linux里面对应的虚拟地址,进行操作。这里涉及到物理地址和虚拟地址之间的转换,需要用到两个函数:ioremapiounmap

1.1、地址映射

1.1.1、ioremap

        用于获取指定物理地址空间对应的虚拟地址空间。

#define ioremap(cookie,size) __arm_ioremap((cookie), (size),
MT_DEVICE)

/*
@Decription:获取指定物理地址对应的虚拟地址
@phys_addr:要映射的物理起始地址
@size:要映射的内存空间大小
@return:__iomem类型指针,指向映射后的虚拟空间首地址
*/
void __iomem * __arm_ioremap(phys_addr_t phys_addr, size_t size,
                             unsigned int mtype)
{
    return arch_ioremap_caller(phys_addr, size, mtype,
                               __builtin_return_address(0));
}

        示例如下:

        有个寄存器SW_MUX_GPIO1_IO03_BASE物理地址为0x020E0068,获取对应的虚拟地址的方法如下:

//寄存器物理地址
#define SW_MUX_GPIO1_IO03_BASE    0x020E0068

//定义一个__iomem类型指针
static void __iomem* SW_MUX_GPIO1_IO03;

//通过ioremap获取对应的虚拟地址
SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4);

1.1.2、iounmap

        卸载驱动的时候释放ioremap函数所做的映射。

/*
@Decription:释放映射后的地址
@addr:要取消映射的虚拟空间起始地址
*/
void iounmap (volatile void __iomem *addr)

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值