RT thread 裝置驅動元件之PIN裝置

2022-07-14 21:45:23 字數 2973 閱讀 4563

在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

;

struct

rt_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(const

char *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:

const

static

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口:

static

struct 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(const

char *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 和輸入事件驅動層。輸入子系統的劃分使得輸入裝置的驅動程式設計越來越簡單,但是其中的思想採用我們學習的重點和難點。...