裝置驅動實現步驟:
1. 按照rt-thread物件模型,擴充套件一物件有兩種方式:
1)定義自己的私有資料結構,然後賦值到rt-thread裝置控制空的user_data指標上;
2)從struct rt_device結構中派生。(推薦)
2. 實現i/o裝置模組中定義的6個公共裝置介面,開始可以為空函式(返回rt_err_t的可預設返回rt_eok)。
3. 根據自己的裝置型別定義自己的私有資料域。
特別是可能有多個類似裝置的情況下(例如串列埠1,2),
裝置介面可以共用一套介面,不同的只是各自的資料域(暫存器基位址)。
4. 根據裝置的型別,註冊到rt-thread裝置框架中。
現以串列埠驅動為例:
/*stm32f10x.h
*this file contains all the peripheral register's definitions, bits
* high density, high density value line, medium density,
* medium density value line, low density, low density value line
* and xl-density devices.
*/typedef
struct
usart_typedef;
structstm32_uart
;
structrt_serial_device
;typedef
struct rt_serial_device rt_serial_t;
/** serial register */
rt_err_t rt_hw_serial_register(
struct rt_serial_device *serial,
const
char *name,
rt_uint32_t flag,
void *data)
struct stm32_uart* uart;rt_hw_serial_register(&serial1, "
uart1",
rt_device_flag_rdwr |rt_device_flag_int_rx ,
uart);
rt_serial_device裝置驅動採用派生rt_device實現驅動,實現一套共用的驅動函式-------linux中相當於platform_driver;
rt_serial_device的私有資料儲存具體裝置相關引數(與硬體密切相關)------linux中相當於platform_device。
最後通過rt_hw_serial_register()/rt_device_register()將uart(硬體device)和rt_serial_device(驅動)註冊到系統驅動框架中(rt_device)。
上述採用派生和私有資料相結合的方法可使具體硬體與驅動分開,便於單獨修改硬體;
原來(舊版本)將具體硬體與驅動都通過私有資料註冊到系統驅動框架中。------自己理解。
私有資料方式實現驅動可節省空間,效率可能更高。
當為了實現硬體與業務分開,故可約定俗成:業務用派生實現,硬體用私有資料實現。
RTT 網口驅動分析
rtt 網口驅動的核心是這個檔案ethernetif.c 此檔案定義了網口驅動的架構,還有幾個常用的命令,比如list if set if set dns eth device init eth device init with flag 這些函式是在具體網絡卡晶元的驅動初始化裡呼叫 的,比如我用的...
RTT裝置與驅動之PWM
這裡將pwm當成乙個裝置 pwm簡介 上圖是乙個簡單的 pwm 原理示意圖,假定定時器工作模式為向上計數,當計數值小於閾值時,則輸出一種電平狀態,比如高電平,當計數值大於閾值時則輸出相反的電平狀態,比如低電平。當計數值達到最大值是,計數器從0開始重新計數,又回到最初的電平狀態。高電平持續時間 脈衝寬...
RTT裝置與驅動之硬體定時器
硬體定時器可以對外部時鐘進行計數,利用內部時鐘進行定時。函式描述 rt device t rt device find const char name 查詢定時器裝置 rt err t rt device open rt device t dev,rt uint16 t oflags ofalgs ...