在rt-thread 2.0.0正式版中引入了pin裝置作為雜類裝置,其裝置驅動檔案pin.c在rt-thread-2.0.1\components\drivers\misc中,主要用於操作晶元gpio, 如點亮led,按鍵等。同時對於相應的晶元平台,需要自行編寫底層gpio驅動,如gpio.c。本文主要涉及的pin裝置檔案有:驅動框架檔案(pin.c,pin.h),底層硬體驅動檔案(gpio.c,gpio.h)。在應用用pin裝置時,需要在rtconfig.h中巨集定義#define rt_using_pin。
一、pin裝置驅動框架
在pin.c中定義了乙個靜態的pin裝置物件static struct rt_device_pin _hw_pin,其中結構體型別struct rt_device_pin在pin.h中定義為:
/*pin device and operations for rt-thread
*/struct
rt_device_pin
;
structrt_device_pin_mode
;struct
rt_device_pin_status
;struct
rt_pin_ops
;
在pin.c中主要實現了_pin_read,_pin_write,_pin_control三個函式,同時將這三個函式註冊為_hw_pin裝置的統一介面函式:
int rt_device_pin_register(constchar *name, const
struct rt_pin_ops *ops, void *user_data)
最後,在pin.c檔案中將rt_pin_mode,rt_pin_write,rt_pin_read三個函式加入到finsh的函式列表中,用於除錯。
二、底層硬體驅動
在gpio.c中主要實現struct rt_pin_ops中的三個介面函式:stm32_pin_mode,stm32_pin_write,stm32_pin_read:
conststatic
struct rt_pin_ops _stm32_pin_ops =;
同時註冊 _hw_pin裝置,其裝置名稱為「pin」,pin裝置硬體初始化:
int stm32_hw_pin_init(void)init_board_export(stm32_hw_pin_init);
//stm32_hw_pin_init will be called in rt_components_board_init()
三、pin裝置初始化
在gpio.c中修改使用的io口陣列:
/*stm32 gpio driver
*/struct
pin_index;/*
led ->pd12,pd13,pd14,pd15; user button->pa0
*/static
const
struct pin_index pins =, //
green
, //
orange
, //
red , //
blue
, //
user button
};
此外在gpio_pin.c的外設初始化函式中,需要先呼叫rt_device_open函式(儘管該函式沒有在底層實現),保證pin裝置物件類的裝置引用計數值ref_count不為0,這樣才可正常使用rt_device_control,rt_device_write,rt_device_read函式操作gpio口:
staticstruct rt_device_pin_mode led_mode=,,,
,};static
struct rt_device_pin_status led_status=, /*
0:green on
*/, /*
1:orange on
*/, /*
2:red on
*/, /*
3:blue on
*/, /*
4:green off
*/, /*
5:orange off
*/, /*
6:red off
*/, /*
7:blue off
*/};
/*it can't be pin_mode_input_pullup, or the key always will keep pin_high status
*/static
struct rt_device_pin_mode key_mode = ;
static
struct rt_device_pin_status key_status = ;
static
struct rt_device_pin * pin_device;
static rt_err_t gpio_pin_init(constchar *pin_device_name)
/*oflag has no meaning for pin device , so set to rt_null
*/if(rt_device_open(&pin_device->parent, rt_null) ==rt_eok)
/*init key
*/rt_device_control(&pin_device->parent, rt_null, &key_mode);
}return0;
}int rt_gpio_pin_init(void
)
RT Thread 串列埠裝置驅動
檔名 serial.c 驅動介面 1.註冊裝置 2.初始化裝置 3.開啟裝置 4.關閉裝置 5.讀操作 6.寫操作 1.註冊裝置 rt err t rt hw serial register rt device t device,const char name,rt uint32 t flag,st...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
輸入裝置驅動之按鍵裝置驅動
linux輸入子系統就是乙個基於分層模式的系統,其基本的層次分解如下圖所示。在圖中我們可以發現輸入子系統主要包括三個部分裝置驅動層 input driver 核心層 input core 和輸入事件驅動層。輸入子系統的劃分使得輸入裝置的驅動程式設計越來越簡單,但是其中的思想採用我們學習的重點和難點。...