Pin驅動框架

以NXP MCXA153為例
PIN設備驅動層
單純的提供接口給應用層用,其中PIN設備驅動框架接口包含rt_pin_read等,具體在pin.c 文件中查看
pin.c是提供應用接口
drv_gpio.c是具體實現
實現操作方法原理
struct rt_pin_ops{ void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode); void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_uint8_t value); rt_ssize_t (*pin_read)(struct rt_device *device, rt_base_t pin); rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode, void (*hdr)(void *args), void *args); rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_base_t pin); rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled); rt_base_t (*pin_get)(const char *name);#ifdef RT_USING_DM rt_err_t (*pin_irq_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode); rt_ssize_t (*pin_parse)(struct rt_device *device, struct rt_ofw_cell_args *args, rt_uint32_t *flags);#endif#ifdef RT_USING_PINCTRL rt_err_t (*pin_ctrl_confs_apply)(struct rt_device *device, void *fw_conf_np);#endif /* RT_USING_PINCTRL */};
rt_pin_ops 成員介紹
pin_mode
引腳初始化
pin_write
引腳寫
pin_read
引腳讀
pin_attach_irq
中斷操作 為某個引腳綁定一個中斷回調函數,使能中斷,當中斷來時調用該函數
pin_detach_irq
中斷操作 脫離某個引腳的中斷回調函數
pin_irq_enable
中斷操作 開啟或關閉中斷
pin_get
獲取某個pin腳編號
pin_irq_mode
pin_parse
pin_ctrl_confs_apply
引腳編號
#define GET_GPIO_PORT(x) ((x) / 32)#defineGET_GPIO_PIN(x)((x)%32)
rt_pin_ops 賦值
rt_hw_pin_init(){ int ret = RT_EOK; mcx_pin_ops.pin_mode = mcx_pin_mode; mcx_pin_ops.pin_read = mcx_pin_read; mcx_pin_ops.pin_write = mcx_pin_write; mcx_pin_ops.pin_attach_irq = mcx_pin_attach_irq; mcx_pin_ops.pin_detach_irq = mcx_pin_detach_irq; mcx_pin_ops.pin_irq_enable = mcx_pin_irq_enable; mcx_pin_ops.pin_get = RT_NULL, ret = rt_device_pin_register("pin", &mcx_pin_ops, RT_NULL);// return ret;}INIT_BOARD_EXPORT(rt_hw_pin_init);
注意:這里的操作很奇怪INIT_BOARD_EXPORT ,根據老師的講解是在預編譯的時候就處理了,具體后面再學習。。。
drv_pin.c 的 rt_hw_pin_init 將底層驅動和驅動框架進行鏈接起來,此文件實現gpio的初始化
添加Pin驅動代碼流程
編寫drv_pin.c文件
實現 rt_pin_ops 的各種操作接口函數
然后利用 rt_hw_pin_init 進行鏈接驅動層
實際上就是指針的賦值
實驗代碼
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */rt_pin_mode(KEY_BAND, PIN_MODE_INPUT);rt_kprintf("MCXA153 HelloWorld\r\n");while (1){ rt_thread_mdelay(1000); if(rt_pin_read(KEY_BAND)) rt_pin_write(LED_PIN, PIN_HIGH); /* Set GPIO output 1 */ else rt_pin_write(LED_PIN, PIN_LOW); /* Set GPIO output 0 */ #if 0 rt_pin_write(LED_PIN, PIN_HIGH); /* Set GPIO output 1 */ rt_thread_mdelay(500); /* Delay 500mS */ rt_pin_write(LED_PIN, PIN_LOW); /* Set GPIO output 0 */ rt_thread_mdelay(500); /* Delay 500mS */ #endif}
注意:這里延遲1s,目的是為了有msh 功能
總結
學習了PIN設備驅動框架的添加
-
驅動
+關注
關注
12文章
1874瀏覽量
86098 -
PIN
+關注
關注
1文章
311瀏覽量
24825 -
RT-Thread
+關注
關注
31文章
1329瀏覽量
41086
發布評論請先 登錄
相關推薦
RT-Thread NUC97x 移植 LVGL
RT-Thread編程指南
RT-Thread用戶手冊
RT-Thread Studio驅動SD卡

【RT-Thread開源作品秀】基于RT-Thread的星務平臺研究

RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制

RT-Thread學習筆記 RT-Thread的架構概述

RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

《RT-Thread設備驅動開發指南》基礎篇--以先楫bsp的hwtimer設備為例

評論