笔记三:嵌入式板子读写寄存器的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/peng_apple/article/details/78343528

注:下面描述以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 <asm/io.h>
           #include <linux/ioport.h>
      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 <asm/io.h>
                #include <mach/regs-gpio.h>
          --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

猜你喜欢

转载自blog.csdn.net/peng_apple/article/details/78343528