地址映射
是虚拟空间到物理空间的映射,也叫做地址映射
ioremap
函数
ioremap
函数用于获取指 定 物 理 地 址 空 间 对 应 的 虚 拟 地 址 空 间。
ioremap 有三个参数,
phys_addr
:要映射的物理起始地址。
size
:要映射的内存空间大小。
mtype
:
ioremap
的类型,可以选择
MT_DEVICE
、
MT_DEVICE_NONSHARED
、
MT_DEVICE_CACHED
和
MT_DEVICE_WC
,
ioremap
函数选择
MT_DEVICE
。
iounmap
函数
卸载驱动的时候需要使用
iounmap
函数释放掉 ioremap 函数所做的映射。ioremap 只有一个参数 addr
,此参数就是要取消映射的虚拟地址空间首地址。
I/O 内存访问函数
读操作函数
读操作函数有如下几个:
示例代码 41.1.2.1 读操作函数
1
u8 readb
(
const volatile void
__iomem
*
addr
)
2
u16 readw
(
const volatile void
__iomem
*
addr
)
3
u32 readl
(
const volatile void
__iomem
*
addr
)
readb
、
readw
和
readl
这三个函数分别对应
8bit
、
16bit
和
32bit
读操作,参数
addr
就是要
读取写内存地址,返回值就是读取到的数据。
写操作函数
写操作函数有如下几个:
示例代码 41.1.2.2 写操作函数
1
void
writeb
(
u8 value
,
volatile void
__iomem
*
addr
)
2
void
writew
(
u16 value
,
volatile void
__iomem
*
addr
)
3
void
writel
(
u32 value
,
volatile void
__iomem
*
addr
)
writeb
、
writew
和
writel
这三个函数分别对应
8bit
、
16bit
和
32bit
写操作,参数
value
是要
写入的数值,
addr
是要写入的地址。
测试
编写LED驱动程序和ARM应用程序
编写:略
编译驱动程序
编写
Makefile 文件,
1
KERNELDIR
:=
/home/zipeng/linux/myKernel/linux-imx
rel_imx_4.1.15_2.1.0_ga_alientek
......
4
obj-m
:= led.o
......
11
clean
:
12
$(MAKE)
-C
$(KERNELDIR) M
=
$(CURRENT_PATH)
clean
make -j4
编译测试 APP
输入如下命令编译测试
ledApp.c
这个测试程序:
arm-linux-gnueabihf-gcc ledApp.c -o ledApp
加载根文件系统测试
略
加载驱动
depmod //第一次加载驱动的时候需要运行此命令
modprobe led.ko //加载驱动
创建/dev/led节点
mknod /dev/led c 200 0
测试节点
./ledApp /dev/led 1 //打开
LED
灯
./ledApp /dev/led 0 //关闭
LED
灯
卸载驱动
rmmod led.ko