浓毛老太交欧美老妇热爱乱,蜜臀性色av免费,妺妺窝人体色www看美女,久久久久久久久久久大尺度免费视频,麻豆人妻无码性色av专区

位置:51電子網(wǎng) » 技術(shù)資料 » 嵌入式系統(tǒng)

嵌入式uClinux下的CAN總線設(shè)備驅(qū)動程序設(shè)計

發(fā)布時間:2008/6/24 0:00:00 訪問次數(shù):835

1、uclinux操作系統(tǒng)概述

  uclinux是linux2.0的一個分支,它被設(shè)計用于沒有mmu的微控制器領(lǐng)域,即被廣泛應(yīng)用于嵌入式linux領(lǐng)域。uclinux的最大特征就是沒有mmu(內(nèi)存管理單元模塊)。它很適合那些沒有mmu的處理器,如arm7tdmi,m68ez328等。

  uclinux具有完全的tcp/ip協(xié)議棧,同時對其他許多的網(wǎng)絡(luò)協(xié)議都提供支持。這些網(wǎng)絡(luò)協(xié)議都在uclinux上得到了很好的實現(xiàn)。uclinux可以稱作是一個針對嵌入式系統(tǒng)的優(yōu)秀網(wǎng)絡(luò)操作系統(tǒng)。

2、linux驅(qū)動程序設(shè)計概述

  linux系統(tǒng)內(nèi)核通過設(shè)備驅(qū)動程序與外圍設(shè)備交互,設(shè)備驅(qū)動程序是linux內(nèi)核的一部分,它是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)通過定義的接口控制一個或多個設(shè)備。

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

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

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

 。2)服務(wù)于i/o請求的子程序,又稱為驅(qū)動程序的上半部分。

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

3、uclinux下can設(shè)備的驅(qū)動程序編寫

  根據(jù)上文對linux下設(shè)備驅(qū)動程序的描述,以及參考相關(guān)的實例分析,下面對can總線設(shè)備sja1000的驅(qū)動程序進行編寫。

  can設(shè)備驅(qū)動程序?qū)嶋H上是linux內(nèi)核直接對sja1000器件的初始化與讀寫操作。經(jīng)分析,sja1000 can驅(qū)動程序構(gòu)成包括如下幾個部分:

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

  #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)

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

2)編寫對sja1000內(nèi)部寄存器訪問的讀寫函數(shù)

  因為s3c4510b處理器的地址和數(shù)據(jù)總線是分開的,而sja1000的地址與數(shù)據(jù)總線是8位分時復(fù)用的。所以我們只有采用先向sja1000的8位地址數(shù)據(jù)總線上送出地址,然后再送數(shù)據(jù)或者讀數(shù)據(jù)的方式。片選信號/cs,讀信號/rd,寫信號/wr仍由s3c4510b自己產(chǎn)生。需要模擬的是鎖存信號ale、地址數(shù)據(jù)總線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);//將地址信息作為數(shù)據(jù)送往sja1000數(shù)據(jù)總線

  io_pdata=0x32;//ale=0,讓sja1000將該地址鎖存

  outl(data,addr);//將數(shù)據(jù)信息送往sja1000數(shù)據(jù)總線

  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); //將地址信息作為數(shù)據(jù)送往sja1000數(shù)據(jù)總線

  io_pdata=0x32; //p0-ale=0,鎖存地址信息

  io_pdata=0x12; //p5-245dir=0,將74hc245的方向置為cpu輸入方向

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

  io_pdata=0x33; //ale置高,74hc245置為不工

1、uclinux操作系統(tǒng)概述

  uclinux是linux2.0的一個分支,它被設(shè)計用于沒有mmu的微控制器領(lǐng)域,即被廣泛應(yīng)用于嵌入式linux領(lǐng)域。uclinux的最大特征就是沒有mmu(內(nèi)存管理單元模塊)。它很適合那些沒有mmu的處理器,如arm7tdmi,m68ez328等。

  uclinux具有完全的tcp/ip協(xié)議棧,同時對其他許多的網(wǎng)絡(luò)協(xié)議都提供支持。這些網(wǎng)絡(luò)協(xié)議都在uclinux上得到了很好的實現(xiàn)。uclinux可以稱作是一個針對嵌入式系統(tǒng)的優(yōu)秀網(wǎng)絡(luò)操作系統(tǒng)。

2、linux驅(qū)動程序設(shè)計概述

  linux系統(tǒng)內(nèi)核通過設(shè)備驅(qū)動程序與外圍設(shè)備交互,設(shè)備驅(qū)動程序是linux內(nèi)核的一部分,它是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)通過定義的接口控制一個或多個設(shè)備。

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

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

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

 。2)服務(wù)于i/o請求的子程序,又稱為驅(qū)動程序的上半部分。

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

3、uclinux下can設(shè)備的驅(qū)動程序編寫

  根據(jù)上文對linux下設(shè)備驅(qū)動程序的描述,以及參考相關(guān)的實例分析,下面對can總線設(shè)備sja1000的驅(qū)動程序進行編寫。

  can設(shè)備驅(qū)動程序?qū)嶋H上是linux內(nèi)核直接對sja1000器件的初始化與讀寫操作。經(jīng)分析,sja1000 can驅(qū)動程序構(gòu)成包括如下幾個部分:

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

  #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)

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

2)編寫對sja1000內(nèi)部寄存器訪問的讀寫函數(shù)

  因為s3c4510b處理器的地址和數(shù)據(jù)總線是分開的,而sja1000的地址與數(shù)據(jù)總線是8位分時復(fù)用的。所以我們只有采用先向sja1000的8位地址數(shù)據(jù)總線上送出地址,然后再送數(shù)據(jù)或者讀數(shù)據(jù)的方式。片選信號/cs,讀信號/rd,寫信號/wr仍由s3c4510b自己產(chǎn)生。需要模擬的是鎖存信號ale、地址數(shù)據(jù)總線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);//將地址信息作為數(shù)據(jù)送往sja1000數(shù)據(jù)總線

  io_pdata=0x32;//ale=0,讓sja1000將該地址鎖存

  outl(data,addr);//將數(shù)據(jù)信息送往sja1000數(shù)據(jù)總線

  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); //將地址信息作為數(shù)據(jù)送往sja1000數(shù)據(jù)總線

  io_pdata=0x32; //p0-ale=0,鎖存地址信息

  io_pdata=0x12; //p5-245dir=0,將74hc245的方向置為cpu輸入方向

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

  io_pdata=0x33; //ale置高,74hc245置為不工

相關(guān)IC型號

熱門點擊

 

推薦技術(shù)資料

DFRobot—玩的就是
    如果說新車間的特點是“靈動”,F(xiàn)QPF12N60C那么... [詳細]
版權(quán)所有:51dzw.COM
深圳服務(wù)熱線:13692101218  13751165337
粵ICP備09112631號-6(miitbeian.gov.cn)
公網(wǎng)安備44030402000607
深圳市碧威特網(wǎng)絡(luò)技術(shù)有限公司
付款方式


 復(fù)制成功!