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