久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式uClinux下的CAN總線設備驅動程序設計

嵌入式uClinux下的CAN總線設備驅動程序設計

作者: 時間:2013-03-30 來源:網絡 收藏

3)定義驅動程序的文件結構

  在LINUX系統中,對硬件設備的訪問也是被當作文件來操作的。這里定義的文件接口將可以在外部的應用程序中被調用。在CAN驅動程序中,只定義了讀CAN信息(CAN接收)、向CAN節點寫信息(CAN發送)、打開CAN設備、關閉CAN設備等4個文件接口。定義信息如下面的程序所示。在sja1000_fops中所定義的函數都必須在驅動程序中編寫。

  static struct file_operations sja1000_fops = {

  read: sja1000_read, //CAN接收數據

  write: sja1000_write,//CAN發送

  open: sja1000_open, //打開設備S3C2410 開發板II(B)+3.5寸帶觸摸TFT液晶屏

  release: sja1000_release, };//關閉設備

4)定義sja1000_write :CAN發送函數(寫函數)

  static int sja1000_write(struct file *filp, const char *buf, size_t size,

  loff_t *offp){ }

  在控制器Sja1000初始化完成后,即可設置CAN發送,具體對sja1000寄存器的相關操作的相關程序可參閱SJA1000器件的數據手冊。

5)定義sja1000_read :CAN接收函數(讀函數)

  static int sja1000_read(struct file *filp, char *buf, size_t size,

  loff_t *offp) { }

  該函數完成對網絡上相應信息的接收。在本系統中CAN接收采用的是查詢方式。

6)編寫sja1000_open:文件打開函數

  static int sja1000_open(struct inode *inode,struct file *file) { }S3C2410 開發板II(B)+3.5寸帶觸摸TFT液晶屏

  進程調用該函數表示對設備的占用。如果返回為-1,表示設備已被其他進程占用,打開非法。如果采用中斷方式,對中斷的注冊也可放在本函數中。

7)編寫sja1000_release:文件關閉函數

  static int sja1000_release(struct inode *inode, struct file *file) { }

  該函數進程完成對設備占有權的釋放,釋放后,其他的進程就可以訪問這個設備了。

8)編寫sja1000_init(void):void sja1000_init(void) { } CAN設備初始化函數

  該函數完成設備在LINUX內核中的登記。并完成對sja1000初始化。

  Sja1000寄存器配置通過調用上面已寫好的sja_write()函數完成。驅動函數登記我們采用的是靜態加載的方式,通過調用register_chrdev()完成,程序如下:

  if(result = register_chrdev(254,"sja1000",sja1000_fops)) S3C2410 開發板II(B)+3.5寸帶觸摸TFT液晶屏

  printk("S3C4510-sja1000: Error %d registering device sja1000", result);

  其中,254是為sja1000設備分配的主設備號,“sja1000”是顯示在/dev中的設備名,sja1000_fops為對應的文件系統指針。返回值小于0表示失敗,大于或等于0表示成功。

9)將驅動程序加到內核中

  當驅動程序sja1000.c編寫完成后,下面的工作就是將它加到內核中了。這需要修改的源代碼,然后重新編譯uClinux內核。

  ①將程序文件sja1000.c復制到/uClinux-dist/linux/drivers/char目錄下。該目錄保存了uClinux字符設備的程序。修改該目錄下mem.c文件,在Init chrdev_init()函數中增加如下代碼:

  #ifdef CONFIG_SJA1000_DRIVER device_init() #endifS3C2410 開發板II(B)+3.5寸帶觸摸TFT液晶屏

  其中CONFIG_SJA1000_DRIVER是在配置uClinux內核時賦值的。

  ②在uClinux/linux/drivers/char目錄下 Makefile中增加如下代碼:

  ifeq($(CONFIG_SJA1000_DRIVER,y) L_OBJS+=sja1000.c endif

  如果在配置uClinux內核的時候選擇了支持我們定義的設備,則在編譯內核的時候會編譯sja1000.c,生成 sja1000.o文件。

  ③修改 /uClinux-dist/linux/arch/m68knonunu目錄下 config.in文件,在 comment' Character devices’語句下面加上

  bool 'support for sja1000 driver'CONFIG_SJA1000_DRIVERS3C2410 開發板II(B)+3.5寸帶觸摸TFT液晶屏

  這樣,在編譯內核,運行make menuconfig的時候,且在配置字符設備時就會有選項:

  support for sja1000 driver 當選中這個選項的時候,就加到內核中了。

  ④在romfs中加上設備驅動程序對應的設備文件。設備文件都被包含在/dev目錄下。uClinux中使用的根文件系統是romfs文件系統。這個文件系統是一個只讀文件系統,所以設備文件必須在編譯內核的時候加到romfs文件系統的image中。

  不同的硬件系統對應不同的設備文件,在/uClinux-dist/vendors目錄下,分別定義了它們的Makefile文件。在uClinux-dist/Vendors里S3C4510對應的目錄下找到它的Makefile文件,并找到區域DEVICES= tty,c,5,0 console,c,5,1 cua0,c,5,64 cual,c,5,65,在后面再加上設備項 sja1000,c,254,1就行了。

  ③重新編譯內核;在shell中將當前目錄cd到uClinux-dist目錄下,然后:S3C2410 開發板II(B)+3.5寸帶觸摸TFT液晶屏

  #make menuconfig #make dep #make

  當驅動程序和uClinux內核一起編譯鏈接并生成映像下載到目標板運行以后,可以通過查看/proc/devices,如果已經顯示有sja1000,則表明設備加載成功。如果使用了中斷,也可以查看/proc/interrupts,該文件記錄了當時已經完成的所有系統中斷情況。

4、結束語

  實時性方面,可以使用進程間通信如管道、消息隊列、共享內存等方法將的接收中斷與應用程序直接關聯,加快系統對CAN總線事件的響應速度。進一步可以通過RTLinux和RTAI(Real Time Application Interface)這兩種方案增強uClinux的實時性。

  本文作者創新點:有效地解決了在沒有MMU的CPU之上開發一些簡單任務操作系統或控制程序效率低、程序簡單的缺點。通過使用嵌入式uClinux,它既保存了原先Linux操作系統穩定性、功能強大等優點,又對內核的代碼重新編寫,減少了內核容量,提高了效率。同時也提出了在CAN總線設備下設計驅動程序的方法。


上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉