車載網絡系統硬件及其驅動的設計
3.2CAN控制器驅動程序的設計
Linux下驅動程序的編寫有特定的規以及一些必要的模塊,init_module模塊是驅動程序中用來加載設備的,系統初始化時調用。此處用 arm9200_mcp2510_init()作為CAN總線驅動程序的入口函數,他將主要完成對MCP2510初始化,調用 register_chrdev()函數向系統注冊字符型設備驅動程序,使用request_irq()函數為CAN總線的中斷處理程序。根據傳遞CAN 數據的要求,設計了如下的數據結構予以存放一幀數據和對接收緩沖區進行管理: Typedef struct{ unsigned int id; / * CAN網絡中節點的標志符 * / unsigned char data[8]; / * 要傳的數據,最大為8個字節 * / unsigned char dlc; / * 發送的數據長度 * / int IsExt; / * 判斷消息是否為擴展幀 * / }candata; Typedef struct{ Candata MCP2510_Candata[128]; / * 定義一個接收緩沖區 * /
int nCanRevpos; / * 數據存入緩沖區的位置指針 * / int nCanReadpos; / * 數據讀出的位置指針 * / int loopbackmode; wait_queue_head_t wq; spinlock_t lock; }MCP2510_DEV;
數據結構file_operations是驅動程序中一個重要的數據結構,內核就是通過這個結構來訪問驅動的。應用程序通過對_read()、_write()、_ioctl()函數調用驅動中相應的程序來讀寫數據和控制字符設備的工作。
3.3 串口驅動程序的設計串口驅動程序采用查詢方式,主要包括串口初始化函數、數據接收函數和數據發送函數。串口初始化函數USIinit()主要是用來設置USART工作是的參數,用戶應用程序可以通過調用數據接收函數RevUSData()對接收到的函數進行各種處理。USART的數據接收和發送都是一個主動的過程,因此此函數的設計較為簡單。數據發送函數SendUSData()類似于數據接收函數,可以被用戶程序調用。
3.4 LCD控制器驅動程序的設計 在驅動LCD設計過程中首要的是要配置LCD控制器,而在配置LCD控制器時最重要的則是本文引用地址:http://www.104case.com/article/197765.htm
指定幀緩沖區(FrameBuffer)。幀緩沖設備對應的設備文件是/dev/fb*,數據結構如下: Static struct file_operations fb_fops={ ower:THIS_MODULE, read:fb_read, write:fb_write, ioctl:fb_ioctl, mmap:fb_mmap, open:fb_open,
}
其中的函數對具體的硬件進行操作,對寄存器進行設置,對顯示緩沖進行映射。初始化函數首先初始化LCD控制器,在Linux中可以用kmalloc()函數動態分配連續LCD顯示緩沖區。接著就是初始化一個fb_info結構,補充成員變量,調用register_framebuffer( fb_info),將fb_info注冊入內核。結構fb_info的成員函數: struct fb_ops{
int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info); int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info); int (*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);
}
4結束語
本文詳細介紹了嵌入式車載網絡系統的底層硬件和驅動程序的設計并成功地完成了硬件與軟件的調試。本文作者創新點:此網絡系統極大地減少了電控裝置數,節省了粗大線束占用的汽車寶貴空間資源以及實現了汽車內部電子儀表間的數據共賞、通信與處理,從而提高了汽車的安全性能。
評論