《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 設計應用 > 嵌入式uClinux下的CAN總線設備驅動程序設計
嵌入式uClinux下的CAN總線設備驅動程序設計
EEworld
EEworld
摘要: 摘要:介紹了uClinux操作系統和嵌入式Linux系統的開發流程及其驅動程序的開發,通過對CAN總線設備SJA1000的驅動...
Abstract:
Key words :

關鍵字:uClinux;嵌入式操作系統;CAN總線設備驅動程序

1、uClinux操作系統概述

uClinux是Linux2.0的一個分支,它被設計用于沒有MMU的微控制器領域,即被廣泛應用于嵌入式Linux領域。uClinux的最大特征就是沒有MMU(內存管理單元模塊)。它很適合那些沒有MMU的處理器,如ARM7TDMI,m68ez328等。

uClinux具有完全的TCP/IP協議棧,同時對其他許多的網絡協議都提供支持。這些網絡協議都在uClinux上得到了很好的實現。uClinux可以稱作是一個針對嵌入式系統的優秀網絡操作系統。

2、Linux驅動程序設計概述

     Linux系統內核通過設備驅動程序與外圍設備交互,設備驅動程序是Linux內核的一部分,它是一組數據結構和函數,這些數據結構和函數通過定義的接口控制一個或多個設備。

和UNIX一樣,Linux中所有的設備均作為文件來對待,這些文件一般稱為特殊文件,這樣做的一個好處是使用戶或應用程序可按操縱普通文件的方式進行訪問控制硬件設備。

Linux內核有三種類型的設備驅動程序:字符設備驅動程序、塊設備驅動程序和網絡設備驅動程序。Linux的設備由一個主設備號(major)和一個次設備號(minor)標識。主設備號唯一標識了設備類型,它是塊設備表或字符設備表中設備表的索引。次設備號僅由設備驅動程序解釋,用于識別同類設備中,I/O請求所涉及到的那個設備。設備驅動程序可以分為3個主要組成部分:

(l)自動配置和初始化子程序,負責檢測所要驅動的硬件設備是否能正常工作。

(2)服務于I/O請求的子程序,又稱為驅動程序的上半部分。

(3)中斷服務子程序,又稱為驅動程序的下半部分。

3、uClinux下CAN設備的驅動程序編寫

根據上文對LINUX下設備驅動程序的描述,以及參考相關的實例分析,下面對CAN總線設備SJA1000的驅動程序進行編寫。

CAN設備驅動程序實際上是linux內核直接對sja1000器件的初始化與讀寫操作。經分析,sja1000 CAN驅動程序構成包括如下幾個部分:

1)定義sja1000芯片內所有寄存器的訪問地址,用于完成對其內部寄存器以及緩沖區的讀寫訪問。例如:

#define IO_PMOD    (*(volatile unsigned *)0x3ff5000)

#define IO_PDATA   (*(volatile unsigned *)0x3ff5008)

#define IO_PCON    (*(volatile unsigned *)0x3ff5004)

#define SJA_MOD    (0x2700000) #define SJA_CMR     (0x2700004)

…………………

#define SJA_CANRXB7 (0x270006c) #define SJA_CANRXB8 (0x2700070)

因為在我們的系統中,對sja1000的讀寫是采用的部分模擬時序的方式,所以用到了S3C4510的IO端口。下面對sja1000地址的定義進行分析。因為uClinux運行的時候,采用的是32位方式,即兩個相鄰地址間相隔4個字節,而在sja1000內部的地址間的間隔只有1個字節。雖然可以對S3C4510的內部寄存器定義為在訪問sja1000的時候,將位寬度定義為8位,但這樣會與linux系統運行不匹配,經測試發現讀寫不正常。所以將sja1000的地址定義為32位寬度。于是各個寄存器地址為(基址+sja1000內部地址×4)。這里將sja1000的基址定義為0x2700000。

2)編寫對SJA1000內部寄存器訪問的讀寫函數

因為S3C4510B處理器的地址和數據總線是分開的,而SJA1000的地址與數據總線是8位分時復用的。所以我們只有采用先向sja1000的8位地址數據總線上送出地址,然后再送數據或者讀數據的方式。片選信號/CS,讀信號/RD,寫信號/WR仍由S3C4510B自己產生。需要模擬的是鎖存信號ALE、地址數據總線AD0-AD7。參照sja1000時序圖,具體的操作步驟見下面程序和注釋。

寫子程序如下:

   void sja_write(unsigned int data, unsigned int addr)

{   unsigned char tmp;

    tmp=(addr)>>2;//將32位地址右移2位,tmp的低8位即為sja1000實際地址。

        outl(tmp,addr);//將地址信息作為數據送往SJA1000數據總線

        IO_PDATA=0x32;//ALE=0,讓SJA1000將該地址鎖存

        outl(data,addr);//將數據信息送往SJA1000數據總線

        O_PDATA=0x33; } //將ALE置高電平,74HC245的/OE置高位

讀子程序如下:

unsigned char sja_read(unsigned int addr)

{ unsigned char data;

    volatile unsigned int data1;

    unsigned char tmp;

tmp=(addr)>>2; //將32位地址右移2位,tmp的低8位即為sja1000實際地址S3C2410

    outl(tmp,addr); //將地址信息作為數據送往SJA1000數據總線

    IO_PDATA=0x32; //p0-ALE=0,鎖存地址信息

    IO_PDATA=0x12; //p5-245dir=0,將74HC245的方向置為CPU輸入方向

    data1=inl(addr); //讀出所需的數據

    IO_PDATA=0x33; //ALE置高,74HC245置為不工作狀態

    data=data1;     return(data);   }//返回數據

    后面對sja1000的初始化、CAN發送與CAN接收函數中需要對寄存器操作均調用sja_write()和sja_read()函數進行。

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){  }

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

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

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

loff_t *offp) {  }

   該函數完成對CAN總線網絡上相應信息的接收。在本系統中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\n", result);

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

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

    當驅動程序sja1000.c編寫完成后,下面的工作就是將它加到uClinux內核中了。這需要修改uClinux的源代碼,然后重新編譯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總線的接收中斷與應用程序直接關聯,加快系統對CAN總線事件的響應速度。進一步可以通過RTLinux和RTAI(Real Time Application Interface)這兩種方案增強uClinux的實時性。

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

5、參考文獻

[1] 白小明,邱桃榮.基于Linux的嵌入式實時操作系統的研究 [J].微計算機信息,2006,5-22:78-79。http://www.51kaifa.com/shop/read.php?ID=4812

[2] 魏長江,張凌云,李國財.基于uClinux的設備驅動程序設計方法及應用實例[J].煤礦機械,2005,8

[3] 蔡莉,盧珞先.RS-485通信與CAN總線的接口設計[J].武漢理工大學學報(信息與管理工程版), 2002,1

[4] 胡晨峰.JFFS2文件系統在uClinux中的應用[J].電子產品世界,2003,7  http://www.51kaifa.com/shop/read.php?ID=4812

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          国产精品久久久久久模特| 国产日韩欧美精品一区| aa级大片欧美| 欧美午夜精品电影| 亚洲经典视频在线观看| 欧美日韩大片一区二区三区| 久久婷婷成人综合色| 一本色道久久88亚洲综合88| 国产一区二区三区在线播放免费观看| 激情文学综合丁香| 国产精品久久久久永久免费观看| 欧美亚洲尤物久久| 亚洲国产精品一区二区三区| 亚洲综合日韩中文字幕v在线| 欧美成人情趣视频| 国产免费观看久久| 欧美一区深夜视频| 国产精品久久久久久久久久免费| 亚洲欧美日韩精品综合在线观看| 国产精品久久久久7777婷婷| 国产区在线观看成人精品| 国产香蕉久久精品综合网| 韩国av一区二区三区在线观看| 亚洲国产一区二区三区青草影视| 夜夜嗨av一区二区三区四季av| 国产自产精品| 亚洲精品国产无天堂网2021| 亚洲综合日韩| 欧美激情va永久在线播放| 亚洲少妇中出一区| 久久精品国产精品亚洲| 日韩一级片网址| 国产精品v日韩精品v欧美精品网站| 国产专区综合网| 欧美成人综合在线| 日韩视频一区二区三区在线播放免费观看| 国产精品天美传媒入口| 欧美激情第8页| 欧美女主播在线| 国内成人精品2018免费看| 欧美一区二区日韩一区二区| 亚洲福利久久| 欧美日本在线观看| 国产午夜精品一区二区三区视频| 国产视频精品免费播放| 99国内精品久久| 亚洲人成亚洲人成在线观看| 亚洲一区二区三区在线播放| 激情懂色av一区av二区av| 伊人成年综合电影网| 在线精品视频在线观看高清| 国产精品任我爽爆在线播放| av不卡在线看| 欧美日韩成人精品| 欧美激情无毛| 国产一区日韩欧美| 欧美韩日视频| 一区二区欧美激情| 亚洲一区二区三区视频播放| 国产区精品在线观看| 一区二区三区国产精华| 欧美一级淫片aaaaaaa视频| 欧美一区二区国产| 免费视频亚洲| 国产精品久久77777| 久久国产精品网站| 亚洲永久免费精品| 久久综合亚洲社区| 亚洲欧美日韩区| 欧美一区在线看| 日韩午夜中文字幕| 国产精品高潮呻吟视频| 国产精品毛片大码女人| 伊人久久久大香线蕉综合直播| 狠狠色丁香婷婷综合影院| 欧美福利电影在线观看| 香蕉久久一区二区不卡无毒影院| 亚洲一区二区三区国产| 欧美视频中文字幕在线| 欧美激情五月| 国产视频一区免费看| 久久午夜国产精品| 欧美黄色成人网| 亚洲影院色无极综合| 亚洲一区二区三区视频| 国产日韩精品视频一区二区三区| 美女精品一区| 午夜精品久久99蜜桃的功能介绍| 亚洲激情第一页| 亚洲欧美日韩国产| 亚洲欧洲日本国产| 极品少妇一区二区三区精品视频| 国产精品久线观看视频| 久久久999精品| 欧美成人嫩草网站| 日韩一级视频免费观看在线| 久久嫩草精品久久久精品| 亚洲尤物精选| 久久激情中文| 国外成人在线视频网站| 免费不卡在线观看| 亚洲午夜av电影| 国内久久精品视频| 欧美精品123区| 伊人久久婷婷色综合98网| 一个色综合av| 在线免费一区三区| 久久久久青草大香线综合精品| 欧美a级片网| 在线观看一区视频| 蜜臀久久99精品久久久久久9| 欧美日韩亚洲一区二| 欧美日韩亚洲一区二区三区四区| 欧美sm重口味系列视频在线观看| 最新国产成人在线观看| 国产精品日韩欧美大师| 亚洲国产你懂的| 亚洲视频免费| 欧美aa国产视频| 国产精品一区在线观看| 一区二区三区国产在线观看| 亚洲欧洲三级电影| 在线精品观看| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲性视频网站| 一区二区三区.www| 欧美理论电影在线播放| 久久久www免费人成黑人精品| 亚洲视频一区在线观看| 日韩写真在线| 欧美一乱一性一交一视频| 午夜精品av| 久久久久网站| 最新中文字幕一区二区三区| 亚洲一区二区视频| 极品裸体白嫩激情啪啪国产精品| 久久久亚洲国产天美传媒修理工| 亚洲精品中文字幕女同| 老鸭窝毛片一区二区三区| 美女啪啪无遮挡免费久久网站| 午夜视频在线观看一区二区| 亚洲国产精品第一区二区| 久久se精品一区精品二区| 欧美日本一区二区高清播放视频| 狠狠狠色丁香婷婷综合激情| 亚洲国产精品成人精品| 欧美日韩八区| 美女999久久久精品视频| 亚洲小说欧美另类社区| 亚洲乱码日产精品bd| 男女激情久久| 在线观看日韩精品| 在线国产精品一区| 亚洲三级电影在线观看| 麻豆久久精品| 久久精品国产99国产精品澳门| 日韩视频在线观看国产| 国产精品久久婷婷六月丁香| 麻豆91精品91久久久的内涵| 欧美电影免费观看高清完整版| 一区在线观看视频| 久久久久国产精品一区三寸| 在线综合+亚洲+欧美中文字幕| 亚洲国产精品va在线看黑人| 欧美美女操人视频| 99精品视频网| 亚洲人精品午夜| 在线观看av一区| 国产伦精品一区二区三区免费| 牛夜精品久久久久久久99黑人| 性欧美暴力猛交69hd| 国产一区二区三区黄| 午夜精品久久久久影视| 亚洲精品三级| 欧美极品aⅴ影院| 欧美亚洲免费电影| 欧美一区二区三区成人| 在线观看视频一区二区欧美日韩| 久久久91精品国产| 欧美日韩亚洲一区二区三区在线| 欧美91视频| 欧美高清影院| 国产精品爽黄69| 欧美日韩在线播放一区| 性高湖久久久久久久久| 狠狠色丁香久久婷婷综合_中| 亚洲精品无人区| 黄色日韩在线| 蜜臀久久久99精品久久久久久| 一区免费观看| 免费一级欧美片在线播放| 欧美日韩在线观看一区二区三区| 亚洲欧美经典视频| 精品99一区二区三区| 这里只有精品视频在线| 国产一区二区三区丝袜| 国产精品成人在线观看| 99精品视频免费| 久久久国产精彩视频美女艺术照福利| 久久久国产精品亚洲一区| 欧美在线首页| 欧美专区在线观看一区| 国产一级精品aaaaa看| 91久久综合亚洲鲁鲁五月天| 欧美成人中文字幕在线| 国产精品一级在线| 欧美少妇一区二区| 国产精品免费福利| 一区二区三区中文在线观看| 亚洲综合色视频| 欧美一乱一性一交一视频| 国产精品自拍一区| 国产欧美一区二区精品秋霞影院| 中文无字幕一区二区三区| 一区二区三区在线视频播放| 亚洲国产一区二区在线| 国产偷久久久精品专区| 久久久精品国产免费观看同学| 欧美日韩亚洲三区| 毛片av中文字幕一区二区| 精久久久久久久久久久| 麻豆精品一区二区综合av| 午夜免费在线观看精品视频| 国产精品久久一级| 久久久夜色精品亚洲| 麻豆视频一区二区| 国产精品系列在线| 国产在线日韩| 亚洲国产精品一区二区www在线| 欧美三级韩国三级日本三斤| 欧美一级久久久久久久大片| 国模叶桐国产精品一区| 亚洲国产精品va在线看黑人动漫| 一区二区三区免费看| 中国女人久久久| 亚洲高清久久| 亚洲乱亚洲高清| 精品9999| 久久精品电影| 一区二区三区国产精华| 亚洲欧美成人精品| 国产精品美女www爽爽爽视频| 欧美日韩1080p| 国产精品你懂的| 韩国av一区二区三区在线观看| 欧美日韩不卡一区| 国产情人节一区| 久久精品一区| 欧美日韩免费观看一区=区三区| 亚洲精品日韩欧美| 亚洲人成网站999久久久综合| 99爱精品视频| 久久香蕉国产线看观看网| 欧美色精品在线视频| 亚洲大胆女人| 亚洲区国产区| 午夜精品一区二区在线观看| 亚洲综合999| 欧美日韩高清在线观看| 亚洲在线观看免费视频| 欧美午夜不卡在线观看免费| 国产一区二区三区在线观看免费视频| 久久精品亚洲一区二区三区浴池| 久久综合精品一区| 国产精品久久久久77777| 欧美日韩一级片在线观看| 亚洲一区二区3| 亚洲国产成人精品女人久久久| 久久精品系列| 国产精品日韩欧美大师| 久久www免费人成看片高清| 黄色成人免费观看| 国产亚洲视频在线| 久久资源在线| 一区二区三区国产在线| 另类欧美日韩国产在线| 欧美大片免费观看在线观看网站推荐| 在线日韩av永久免费观看| 国产精品电影网站| 久久久久久香蕉网| 欧美老女人xx| 国产精品自在线| 欧美午夜在线观看| 国内精品**久久毛片app| 欧美丰满少妇xxxbbb| 日韩亚洲欧美精品| 久久久久成人精品免费播放动漫| 久久综合九色欧美综合狠狠| 最新国产乱人伦偷精品免费网站| 在线 亚洲欧美在线综合一区| 国产精品美女xx| 久久这里只有| 久久久美女艺术照精彩视频福利播放| 国产午夜亚洲精品羞羞网站| 亚洲二区在线观看| 亚洲精品乱码久久久久久蜜桃91| 老色鬼精品视频在线观看播放| 狠狠狠色丁香婷婷综合久久五月| 欧美精品在线视频观看| 欧美插天视频在线播放| 久久在精品线影院精品国产| 亚洲美女av黄| 美女视频黄 久久| 欧美精品乱码久久久久久按摩| 欧美美女视频| 国产精品呻吟| 久久精品国产亚洲精品| 亚洲一区视频在线观看视频| 亚洲国产精彩中文乱码av在线播放| 亚洲电影免费在线| 蜜桃精品久久久久久久免费影院| 久久精品99国产精品日本| 欧美精品亚洲| 欧美亚洲在线视频| 欧美成人自拍视频| 亚洲国产99精品国自产| 国产乱理伦片在线观看夜一区| 国产一区二区电影在线观看| 午夜精品福利在线观看| 亚洲裸体在线观看| 性欧美精品高清| 国模私拍视频一区| 欧美日韩国产美女| 亚洲裸体俱乐部裸体舞表演av| 日韩视频―中文字幕| 国产精品五区| 久久九九免费视频| 亚洲欧美国产高清va在线播|