imx8 GPIO 设备驱动介绍

目的:通过 GPIO 驱动配置实现控制 imx8 芯片引脚电平变化
硬件平台:imx8qmmek evm board
软件环境:imx-p9.0.0_2.1.0-auto-ga

我这里使用的是通过 DTS 文件来进行设备硬件资源的申请及分配,用户可以在 fsl-imx8qm-mek.dtsi 文件下操作 DTS,定义 myled 设备节点如下:

myled {
		compatible = "fsl,myled";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_gpio_keys>;
	};

使用的引脚编号为 GPIO4_22,引脚功能定义 pinctrl_gpio_keys 如下:

pinctrl_gpio_keys: myled{
			fsl,pins = <
				SC_P_QSPI1A_DQS_LSIO_GPIO4_IO22		0x00000021
			>;
		};

以上便完成 DTS 配置,接下来需要编写驱动代码 myled.c ,首先建立好驱动代码框架,

  1. 构建 platform_driver 结构体及定义 compatible
static const struct of_device_id myled_ids[] = {
	
	{ .compatible = "fsl,myled", },
	{ },
};
static struct platform_driver myled_driver={
	.probe  = myled_probe,
	.remove = myled_remove,
	.driver = {
		.name  = "myled",
		.of_match_table = myled_ids,
	}
};
  1. 注册平台驱动
static int __init myled_init(void)
{
	/*2. 注册平台驱动*/
	platform_driver_register(&myled_driver);
	return 0;
}
  1. 注销平台驱动
static void __exit myled_exit(void)
{

	/*3. 注销平台驱动*/
	platform_driver_unregister(&myled_driver);
	
}
  1. 定义 probe 函数
static  int myled_probe(struct platform_device *pdev)
{
	int ret;
	ret = gpio_request(USER_LED, "LED");//第一个参数,为要申请的引脚,第二个为你要定义的名字
	if (ret) 
	{
		printk("[pual] gpio_request error %s - %d -- \n",__func__,__LINE__);
            	return ret;
       }
	gpio_direction_output(USER_LED, 1);
	gpio_set_value(USER_LED, 1);
	major = register_chrdev(0,"myled",&myled_drv_fops);
	
      //创建设备信息,执行后会出现 /sys/class/myled
      myled_class = class_create(THIS_MODULE, "myled");

	//创建设备节点,就是根据上面的设备信息来的
      myled_class_devs = device_create(myled_class, NULL, MKDEV(major, 0), NULL, "myled"); /* /dev/myled */
	
	return 0;	
}
  1. 定义 ioctl 函数
static long myled_drv_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{	
	printk("gpio_ioctl\n");
	switch(cmd) {

        case 1:
			if(arg == 0)
			{
				gpio_set_value(USER_LED, 0);
				printk("led is off\n");
				break;
			}else
				{
          	 			gpio_set_value(USER_LED, 1);
            				printk("led is on\n");
            				break;
				}
        default:
           	 	return -EINVAL;
	}
	return 0;
}
  1. 设定引脚编号
#define USER_LED      374		/*GPIO LED  GPIO4_22*/

以上便完成 GPIO 驱动代码,通过应用程序便可以调用 ioctl 函数控制引脚电平变换

注意:

imx8 GPIO 引脚编号设定与其他芯片会有所不同,总共有八组 GPIO,GPIO0~GPIO6,
imx8 GPIO 设备驱动介绍_第1张图片
它们所对应的编号分别为:

GPIO0 480 - 511
GPIO1 448 - 479
GPIO2 416 - 447
GPIO3 384 - 415
GPIO4 352 - 383
GPIO5 320 - 351
GPIO6 288 - 319

对应驱动程序 myled.c、应用程序 myled_test.c、DST 文件 fsl-imx8qm-mek.dtsi 已上传,连接如下:https://download.csdn.net/download/qq_37860012/11503851

你可能感兴趣的:(Linux,imx8,gpio)