杂项设备GPIO框架

杂项设备GPIO框架

GPIO框架主要分为三个部分:

  1. 注册设备;
  2. 注册驱动;
  3. 生成设备节点。

注册设备

设备注册在平台文件中注册,主要分为三步:

  1. 配置Kcnfig文件;
  2. 在menuconfig里面对内核进行剪裁;
  3. 编译内核,烧写进开发板。

注册驱动

下面以模块化的方式进行驱动注册,主要是方便调试

模块加载和模块卸载函数

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;
}

完毕

发布了6 篇原创文章 · 获赞 2 · 访问量 120

猜你喜欢

转载自blog.csdn.net/qq_44931814/article/details/105622970