void bcm_gpio_cfgpin(unsigned int gpio, unsigned int config)
时间: 2023-12-23 21:01:58 浏览: 18
这个函数用于配置Broadcom SoC芯片上的GPIO引脚的功能模式和电气特性。该函数的参数gpio表示GPIO引脚编号,config表示引脚的配置信息。具体来说,config参数包含以下几个位域:
- bit 0-2: 引脚功能模式,0表示普通输入,1表示普通输出,2表示专用功能1,3表示专用功能2,以此类推。
- bit 3-4: 引脚驱动能力,0表示2mA,1表示4mA,2表示6mA,3表示8mA。
- bit 5: 引脚上拉电阻,0表示禁用,1表示启用。
- bit 6: 引脚下拉电阻,0表示禁用,1表示启用。
- bit 7: 引脚中断触发方式,0表示边沿触发,1表示电平触发。
- bit 8: 引脚中断触发边沿,0表示上升沿/高电平触发,1表示下降沿/低电平触发。
例如,要将GPIO引脚23配置为普通输出、8mA驱动、禁用上拉电阻、启用下拉电阻、边沿触发、下降沿触发,则可以将config参数设置为0x5c。
在这个驱动程序中,bcm_gpio_cfgpin函数用于配置LED引脚的功能模式和电气特性,以便控制LED的亮灭。
相关问题
void bcm_gpio_cfgpin(unsigned int gpio, unsigned int config) { volatile unsigned int* GPFSELx; GPFSELx = (volatile void *)(io_addr+gpio/10*4); iowrite32(~(7<<(gpio%10*3)) & ioread32(GPFSELx),GPFSELx); iowrite32((config<<(gpio%10*3))|ioread32(GPFSELx),GPFSELx); } void gpio_set_usr(unsigned gpio, int value) { volatile unsigned int* GPSETx; volatile unsigned int* GPCLRx; GPSETx = (volatile void *)(io_addr+0x1C+gpio/32*4); GPCLRx = (volatile void *)(io_addr+0x28+gpio/32*4); if(value) iowrite32(1<<(gpio%32),GPSETx); else iowrite32(1<<(gpio%32),GPCLRx); }
这段代码是用来控制树莓派GPIO口的,第一个函数 bcm_gpio_cfgpin 用来设置 GPIO 口的功能,第二个函数 gpio_set_usr 用来设置 GPIO 口的输出状态。其中,bcm_gpio_cfgpin 函数中的参数 gpio 是要设置的 GPIO 口编号,config 是要设置的功能,例如输入、输出、PWM 等;gpio_set_usr 函数中的参数 gpio 是要控制的 GPIO 口编号,value 是要设置的输出状态,1 表示输出高电平,0 表示输出低电平。
static __INLINE void *GPIO_MODREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_DDR); } static __INLINE void *GPIO_WDATAREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_DR); } static __INLINE void *GPIO_RDATAREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_EXT_PORTA); } static __INLINE void *GPIO_INTENREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_INTEN); } static __INLINE void *GPIO_INTMASKREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_INTMASK); } static __INLINE void *GPIO_INTLVLREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_INTTYPE_LEVEL); } static __INLINE void *GPIO_INTPOLREG(unsigned gpio) { return (void*)(gpio_get_regbase(gpio) + GPIO_SWPORTA_INT_POLARITY); }
这段代码定义了一系列的内联函数,用于获取GPIO引脚相关寄存器的地址。让我们逐个解释这些函数的作用:
1. `GPIO_MODREG(unsigned gpio)`:返回指定GPIO引脚的模式寄存器(MODREG)的地址。通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_DDR`得到模式寄存器的地址。
2. `GPIO_WDATAREG(unsigned gpio)`:返回指定GPIO引脚的输出数据寄存器(WDATAREG)的地址。同样地,通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_DR`得到输出数据寄存器的地址。
3. `GPIO_RDATAREG(unsigned gpio)`:返回指定GPIO引脚的输入数据寄存器(RDATAREG)的地址。通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_EXT_PORTA`得到输入数据寄存器的地址。
4. `GPIO_INTENREG(unsigned gpio)`:返回指定GPIO引脚的中断使能寄存器(INTENREG)的地址。通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_INTEN`得到中断使能寄存器的地址。
5. `GPIO_INTMASKREG(unsigned gpio)`:返回指定GPIO引脚的中断屏蔽寄存器(INTMASKREG)的地址。通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_INTMASK`得到中断屏蔽寄存器的地址。
6. `GPIO_INTLVLREG(unsigned gpio)`:返回指定GPIO引脚的中断触发电平寄存器(INTLVLREG)的地址。通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_INTTYPE_LEVEL`得到中断触发电平寄存器的地址。
7. `GPIO_INTPOLREG(unsigned gpio)`:返回指定GPIO引脚的中断触发极性寄存器(INTPOLREG)的地址。通过调用`gpio_get_regbase(gpio)`获取GPIO组的寄存器基地址,然后加上偏移量`GPIO_SWPORTA_INT_POLARITY`得到中断触发极性寄存器的地址。
这些内联函数提供了一种方便的方式来获取GPIO引脚相关寄存器的地址,以便进行相应的配置和操作。