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

2019-07-12 23:11发布

注:下面描述以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