本文我們要講的是如何通過 GPIO 驅(qū)動(dòng)配置實(shí)現(xiàn)控制 i.MX8 芯片引腳電平變化。
硬件平臺(tái):i.MX8QMMEK EVM Board
軟件環(huán)境:i.MX-P9.0.0_2.1.0-AUTO-GA
我們這里使用的是通過 DTS 文件來進(jìn)行設(shè)備硬件資源的申請(qǐng)及分配,用戶可以在 fsl-imx8qm-mek.dtsi 文件下操作 DTS,文件所在目錄:kernel_imxarcharm64bootdtsfreescale,定義 myled節(jié)點(diǎn) 設(shè)備如下:
myled {
compatible = "fsl,myled";
pinctrl-names = "default";
pinctrl-0 = < &pinctrl_gpio_keys >;
};
使用的引腳編號(hào)為 GPIO4_22,引腳功能定義 pinctrl_gpio_keys 如下:
pinctrl_gpio_keys: myled{
fsl,pins = <
SC_P_QSPI1A_DQS_LSIO_GPIO4_IO22 0x00000021
>;
};
以上便完成 DTS 配置,接下來需要編寫驅(qū)動(dòng)代碼 myled.c ,首先建立好驅(qū)動(dòng)代碼框架:
- 構(gòu)建 platform_driver 結(jié)構(gòu)體及定義 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,
}
};
- 注冊(cè)平臺(tái)驅(qū)動(dòng)
static int __init myled_init(void)
{
/*2. 注冊(cè)平臺(tái)驅(qū)動(dòng)*/
platform_driver_register(&myled_driver);
return 0;
}
- 注銷平臺(tái)驅(qū)動(dòng)
static void __exit myled_exit(void)
{
/*3. 注銷平臺(tái)驅(qū)動(dòng)*/
platform_driver_unregister(&myled_driver);
}
- 定義 probe 函數(shù)
static int myled_probe(struct platform_device *pdev)
{
int ret;
ret = gpio_request(USER_LED, "LED");//第一個(gè)參數(shù),為要申請(qǐng)的引腳,第二個(gè)為你要定義的名字
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);
//創(chuàng)建設(shè)備信息,執(zhí)行后會(huì)出現(xiàn) /sys/class/myled
myled_class = class_create(THIS_MODULE, "myled");
//創(chuàng)建設(shè)備節(jié)點(diǎn),就是根據(jù)上面的設(shè)備信息來的
myled_class_devs = device_create(myled_class, NULL, MKDEV(major, 0), NULL, "myled"); /* /dev/myled */
return 0;
}
- 定義 ioctl 函數(shù)
static long myled_drv_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
printk("gpio_ioctln");
switch(cmd) {
case 1:
if(arg == 0)
{
gpio_set_value(USER_LED, 0);
printk("led is offn");
break;
}else
{
gpio_set_value(USER_LED, 1);
printk("led is onn");
break;
}
default:
return -EINVAL;
}
return 0;
}
- 設(shè)定引腳編號(hào)
#define USER_LED 374 /*GPIO LED GPIO4_22*/
以上便完成 GPIO 驅(qū)動(dòng)代碼,通過應(yīng)用程序便可以調(diào)用 ioctl 函數(shù)控制引腳電平變換。
注意:
i.MX8 GPIO 引腳編號(hào)設(shè)定與其他芯片會(huì)有所不同,總共有八組 GPIO,GPIO0~GPIO6,如下圖所示:

它們所對(duì)應(yīng)的編號(hào)分別為:

前面完成了對(duì) i.MX8 GPIO 設(shè)備驅(qū)動(dòng)的介紹,后續(xù)將會(huì)分享更多關(guān)于 i.MX8 系列的開發(fā)內(nèi)容。
-
芯片
+關(guān)注
關(guān)注
463文章
54018瀏覽量
466333 -
電平
+關(guān)注
關(guān)注
5文章
372瀏覽量
41634 -
引腳
+關(guān)注
關(guān)注
16文章
2111瀏覽量
55709 -
GPIO
+關(guān)注
關(guān)注
16文章
1329瀏覽量
56236
發(fā)布評(píng)論請(qǐng)先 登錄
i.MX6ULL 驅(qū)動(dòng)開發(fā)7—按鍵輸入捕獲與GPIO輸入配置與高低電平讀取
怎樣通過GPIO驅(qū)動(dòng)配置去實(shí)現(xiàn)控制imx8芯片引腳電平變化
如何將對(duì)i.MX8芯片的支持添加到rustBoot?
i.MX8以太網(wǎng)無法配置靜態(tài)IP如何解決?
i.MX8 SPI CS引腳不工作是怎么回事?
在i.MX8 Mini的參考手冊(cè)框圖中為什么找不到SCU?
是否有任何文檔提供i.MX8的MTBF值?
無法在i.MX8文檔中找到有關(guān)DP引腳的任何信息,求分享
i.mx8系列是在哪里制造的?
NXP i.MX8系列性能比較
淺談NXP i.MX8系列應(yīng)用處理器
i.MX8 Android Automotive12 修改開機(jī) logo
恩智浦i.MX8處理器的集成電源設(shè)計(jì)
面向NXP i.MX8處理器的電源解決方案
如何通過GPIO驅(qū)動(dòng)配置實(shí)現(xiàn)控制i.MX8芯片引腳電平變化
評(píng)論