在上一篇的混杂设备驱动中,我们使用了一些GPIO的接口函数,包含申请、设置等功能,下面简单介绍一下这些接口函数
1.int gpio_request(unsigned gpio, const char *label); //申请一个GPIO给自己用
unsigned gpio:GPIO对应的"ID"--》GPIO号,在Linux系统中可以在内核中平台对应的配置中查看,
kernel\arch\arm\plat-s5p6818\common\cfg_type.h,一般都是一个枚举
enum {
PAD_GPIO_A = (0 * 32),
PAD_GPIO_B = (1 * 32),
PAD_GPIO_C = (2 * 32),
PAD_GPIO_D = (3 * 32),
PAD_GPIO_E = (4 * 32),
PAD_GPIO_ALV = (5 * 32),
};
const char *label:自定义GPIO口的名字
返回值:
成功返回0,失败返回一个负的错误码。
2.void gpio_free(unsigned gpio);//释放一个GPIO
unsigned gpio:GPIO对应的"ID"
3.int gpio_direction_input(unsigned gpio);//设置一个GPIO为输入模式
unsigned gpio:GPIO对应的"ID"
成功返回0,失败返回一个负的错误码。
4.int gpio_direction_output(unsigned gpio, int value);//设置一个GPIO为输出模式,并设置初始值
unsigned gpio:GPIO对应的"ID"
int value:初始值,0为低电平,1为高电平
成功返回0,失败返回一个负的错误码。
5.int gpio_get_value(unsigned gpio);//得到一个GPIO当前的电平值
unsigned gpio:GPIO对应的"ID"
成功返回0,失败返回一个负的错误码。
6.void gpio_set_value(unsigned gpio, int value);//设置一个GPIO的电平值
unsigned gpio:GPIO对应的"ID"
int value:设置GPIO口的高低电平
7.简单使用举例
#define DEVICE_NAME "ultra_drv"
#define GPIOC_CFG_ULTRA_TRIG (PAD_GPIO_B + 28) //Trig引脚
#define GPIOC_CFG_ULTRA_ECHO (PAD_GPIO_B + 29) //Echo引脚
gpio_free(GPIOC_CFG_ULTRA_TRIG); //野路子,避免内核中已经有功能使用该引脚,先释放掉,正常操作应该是如果内核中已经使用过,需要在内核中去掉使用的地方,一般关闭条件编译选项即可
ret = gpio_request(GPIOC_CFG_ULTRA_TRIG, "ultra_drv"); //释放后再申请给我们使用
if(ret < 0){
printk("<4>" "gpio_request %s %d fail\n", DEVICE_NAME, GPIOC_CFG_ULTRA_TRIG);
return ret;
}
gpio_direction_output(GPIOC_CFG_ULTRA_TRIG, 1); //启动信号,设置为输入并拉高
udelay(20); //至少维持10uS的高电平
gpio_set_value(GPIOC_CFG_ULTRA_TRIG, 0); //设置为输入并拉低,启动成功
static int echo_data_in(void)
{
gpio_direction_input(GPIOC_CFG_ULTRA_ECHO); //设置为输入引脚
return gpio_get_value(GPIOC_CFG_ULTRA_ECHO); //检测当前电平
}
一般在驱动编写时会需要采集某个电平持续的时间或是需要等待该状态结束后执行其他操作,通常采用就是获取的方式
do{
time_cnt++;
usleep(10);
}while(gpio_get_value(GPIOC_CFG_ULTRA_ECHO) == 1)
if(time_cnt > 10){
//do what you want
}
MODULE_LICENSE("GPL");