嵌入式linux下GPIO驱动程序,这是在嵌入式设备中最基本的操作,也是菜鸟进阶必经之路,,今天我们就用各个实例来让你深刻的了解GPIO驱动程序,这都是我自己亲手做过的,可以慢慢来理解。
首先我们在看驱动程序的代码之前,先要知道库函数:
内核GPIO库函数:
int gpio_request(unsigned gpio,const char *label)//申请GPIO资源
参数gpio表示GPIO所对应的编号,由于在平台代码中,已经将CPU所有的GPIO进行统一的规划和编号
参数*label表示标签
因为gpio在内核中,就和内存一样,所以你需要的就是申请
当返回的值小于0的话,那么就表示失败,如果大于0那就表示功能
gpio_direction_output(unsigned gpio,int value)//配置GPIO为输出口,并输出value(0,1)
gpio_direction_input(unsigned gpio)//配置为输入口
gpio_set_value(unsigned gpio,int value);
//将GPIO寄存器设置为0或1,该函数并不设置GPIO为输出,只是把相应的寄存器设置为0
gpio_get_value(unsigned gpio);//同理,设置为输入
gpio_free(unsigned gpio);//释放GPIO资源
以上函数返回值表示GPIO的状态
上面这些就是GPIO驱动程序的基本概念理解,你必须要了解,才能进行接下来的操作,接下来就是GPIO驱动程序的操作,我们就来通过一个蜂鸣器的例子,来让你对GPIO驱动程序的操作有深刻理解,蜂鸣器的例子是这样的:要求驱动加载的时候,打开蜂鸣器,卸载驱动时,关闭蜂鸣器,下面就来解答。
#include
#include
#include
#include
#define LED_ON 1//宏定义一下,为了美观
#define LED_OFF 0
//定义硬件GPIO结构体
struct led_resource{
unsigned long gpio;//gpio的编号,每个GPIO都有一个内核分配的唯一编号
char *name; //gpio的标签
};
static struct led_resource led_info[]={
[0] = {
.gpio = S5PV210_GPD0(0),//管脚信息
.name = "GPC0_0"//管脚名称
},
};
static void led_control(unsigned long gpio,int flags)
{
gpio_direction_output(gpio,0);//这句表示先把当前GPIO口设置为输出口,并且输出0
gpio_set_value(gpio,flags);//然后在输出想要设置的电平,前面先设置0是为了防止干扰
}
static int led_init(void)
{
gpio_request(led_inf0[0].gpio,led_inf[0].name);//申请GPIO资源
led_control(led_inf0[i].gpio,LED_ON);//调用函数来设置输出口为1
return 0;
}
static void led_exit(void)
{
led_control(led_inf0[0].gpio,LED_OFF);//调用函数输出0关闭蜂鸣器
gpio_free(led_inf0[0].gpio);//释放GPIO资源
}
module_init(led_init);//注册入口函数
module_exit(led_exit);//注册出口函数
MODULE_LICENSE("GPL V2");//声明该程序符合国际GPL委员会制定的标准
切记:在加载的时候,内核会有调用入口函数,他就会执行入口函数的命令,灯就会亮,蜂鸣器就会叫,一但卸载驱动程序的时候,内核就会自动调用出口函数,当然也会执行出口函数的内容。写好程序后,把代码写成.C文件然后放在linux内核源代码字符设备驱动所在的文件夹下,然后用当前目录的makefile编译一下,然后把编译好的驱动程序通过tftp或其他方式传到开发板的文件系统的任意一个文件夹。然后用命令加载这个驱动程序或者卸载
这样你就看到现象了,是不是不是那么难,不管是什么样的例子,你只要掌握GPIO驱动程序操作方法,那你就都可以迎刃而解了,想要了解更多GPIO驱动程序操作方法,你可以参考Linux内核驱动之gpio子系统的使用