注:下面描述以S5PV210(A8)板子为例。
功能:点亮一个led灯(GPH0_3)。
GPH0_3:GPH0的物理地址为:0xe0200c00
分为控制寄存器和数据寄存器:分别占4个字节。
//***************
此处引出led灯的物理地址查找方法:
如LED灯
--->板子原理图(底板原理图--->到核心板原理图)
--->找到对应器件I/O口
--->查找芯片资料I/O口对应的寄存器位置。
***************//
方法一:
首先在boot终端:用mw命令直接操作寄存器。
mw 物理地址 配置值
mw 0xe0200c00 0x1111:(对应控制寄存器设置输出)
mw 0xe0200c04 0xf:(对应数据寄存器设为1,则LED点亮)
方法二:应用ioremap函数操作寄存器。
1.包含头文件:
#include
#include
2.使用I/O内存必须要先申请:
request_mem_region(phy_start, size, name);
例:
struct resource *gph_res = NULL;
gph_res = request_mem_region(0xe0200c00, 0x80, "demo_gph");
3.寄存器地址映射:
static void __iomem *gph_base = NULL;
gph_base = ioremap(0xe0200c00, 0x80);
4.各寄存器虚拟地址
映射后的寄存器地址排列顺序和间隔同映射前一直,因此 虚拟首地址+偏移量即可得到具体寄存器地址
5.读写寄存器,用readl/writel。
《1》直接操作寄存器地址
writel(0x1111, gph_base);//写控制寄存器
writel(0xf, (gph_base +4));//写数据寄存器
unsigned int reg = readl((gph_base +4) );//读数据寄存器
《2》使用内核已映射完成的寄存器虚拟地址
--包含头文件:
#include
#include
--S5PV210_GPH0_BASE为GPH0组IO寄存器集合的 起始地址,加上偏移量后即可访问具体寄存器
--readl/writel读写
unsigned int tmp;
tmp = readl(S5PV210_GPH0_BASE+4);
writel(tmp,S5PV210_GPH0_BASE+4);
6.释放:
iounmap(gph_base);
release_mem_region(0xe0200c00,0x80);
方法三:使用内核提供接口操作。
以S5PV210芯片为例:不同的芯片可能提供函数接口不一样!
1、 bit的读、写
gpio_set_value(S5PV210_GPH0(i), 0); //代替 以前的 s3c2410_setpin()
gpio_get_value(S5PV210_GPH0(i));
2、配置输入、输出、其他功能
s3c_gpio_cfgpin(S5PV210_GPH0(0),S3C_GPIO_OUTPUT); //S3C_GPIO_INPUT
3、上拉
s3c_gpio_setpull(S5PV210_GPH2(3),S3C_GPIO_PULL_UP);
4、驱动能力
s5p_gpio_set_drvstr(S5PV210_GPH3(0), 2); //驱动能力 0-3
5、中断
ret = set_irq_type(IRQ_EINT(19),IRQ_TYPE_EDGE_FALLING);
ret = request_irq(IRQ_EINT(23),buttons_interrupt, 0,"KEY6", (void *)6);
6、任意中断 (前提这个管脚有中断功能) (gpio_to_irq)
.start = S5PV210_GPJ2(7),//IRQ_EINT_GROUP(20, 7), //J2_7
s3c_gpio_cfgpin(wiegand.r0->start, S3C_GPIO_SFN(15));
status = request_irq(gpio_to_irq(wiegand.r0->start), eint_irq, wiegand.r0->flags & IRQF_TRIGGER_MASK, "wiegand0", (void*)0);
方法四:使用sysfs文件系统操作。
通过sys文件系统操作GPIO:
cd /sys/class/gpio/
- 找到gpio编号:cat gpiochip128/label
- 创建gpio属性文件:echo 129 > export
- 设备引脚方向:echo out > direction
- 修改引脚值:echo 1 > value
- 删除gpio属性文件:echo 129 > unexport