imx8 GPIO 设备驱动介绍

本文详细介绍如何通过GPIO驱动配置实现imx8芯片引脚电平变化,包括DTS文件配置、驱动代码编写及应用程序调用ioctl函数控制引脚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的:通过 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,
在这里插入图片描述
它们所对应的编号分别为:

GPIO0480 - 511
GPIO1448 - 479
GPIO2416 - 447
GPIO3384 - 415
GPIO4352 - 383
GPIO5320 - 351
GPIO6288 - 319

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值