杂项设备GPIO框架
GPIO框架主要分为三个部分:
- 注册设备;
- 注册驱动;
- 生成设备节点。
注册设备
设备注册在平台文件中注册,主要分为三步:
- 配置Kcnfig文件;
- 在menuconfig里面对内核进行剪裁;
- 编译内核,烧写进开发板。
注册驱动
下面以模块化的方式进行驱动注册,主要是方便调试
模块加载和模块卸载函数
module_init(gpio_init);
module_exit(gpio_exit);
初始化函数和卸载函数
static int gpio_int(void)
{
platform_driver_register(&gpio_driver);//注册驱动
return 0;
}
static void gpio_exit(void)
{
platform_driver_unregister(&gpio_driver);//卸载驱动
}
平台驱动结构体platform_driver
platform_driver结构体成员还是挺多的,我这只用了probe和remove,示例如下:
struct platform_driver gpio_driver =
{
.probe = gpio_probe,
.remove = gpio_remove,
.driver = {
.name = device_name,//注册的设备名称
.owner = THIS_MODULE,
}
};
probe函数和remove函数
static int gpio_probe(struct platform_device *dev )
{
gpio_request(gpio,"gpio");//根据实际情况写
s3c_gpio_cfgpin(gpio,s3c_GPIO_OUTPUT);//将引脚设为输出模式
gpio_set_value(gpio,0);//将引脚拉低
misc_register(&gpio_dev);//注册杂项设备,成功后将生成设备节点
return 0;
}
static int gpio_remove(struct platform_device *dev )
{
misc_deregister(&gpio_dev);//卸载杂项设备
return 0;
}
miscdevice结构体
static struct miscdevice gpio_dev =
{
.minor = MISC_DYNAMIC_MINOR,//自动分配设备号
.name = MISC_NAME,//生成设备节点的名称
.fops = &gpio_ops,//与file_operations结构体连接起来
};
file_operations结构体
结构体file_operations也有很多成员,我这只用了两个,具体看个人需求
static struct file_operations gpio_ops =
{
.owner = THIS_MODULE,
.unlocked_ioctl = gpio_ioctl,
.release = gpio_release,
};
unlocked_ioctl函数和release函数
static long gpio_ioctl(struct file *files, unsigned int ctl, unsigned long arg)
{
gpio_set_value(gpio,ctl);
return 0;
}
static int gpio_release(struct inode *, struct file *)
{
printfk("release!!\n");
return 0;
}