i.MX8 系列 | 如何通过 GPIO 驱动配置实现控制 i.MX8 芯片引脚变化

本文我们要讲的是如何通过 GPIO 驱动配置实现控制 i.MX8 芯片引脚电平变化。

硬件平台:i.MX8QMMEK EVM Board

软件环境:i.MX-P9.0.0_2.1.0-AUTO-GA

 

我们这里使用的是通过 DTS 文件来进行设备硬件资源的申请及分配,用户可以在 fsl-imx8qm-mek.dtsi 文件下操作 DTS,文件所在目录:kernel_imx\arch\arm64\boot\dts\freescale,定义 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 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,
}
};

 


2. 注册平台驱动

static int __init myled_init(void)  
{
/*2. 注册平台驱动*/
platform_driver_register(&myled_driver);
return 0;
}


3. 注销平台驱动

static void __exit myled_exit(void)  
{
/*3. 注销平台驱动*/
platform_driver_unregister(&myled_driver);
}


4. 定义 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;
}

 

5. 定义 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;
}


6. 设定引脚编号

#define USER_LED      374       /*GPIO LED  GPIO4_22*/  

 

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

 

注意 :

i.MX8 GPIO 引脚编号设定与其他芯片会有所不同,总共有八组 GPIO,GPIO0~GPIO6,如下图所示:

           

它们所对应的编号分别为:

         

前面完成了对 i.MX8 GPIO 设备驱动的介绍,后续将会对 i.MX8 通过 Android APP 访问硬件驱动。

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论