0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

以u(píng)Clinux為背景,介紹中斷驅(qū)動(dòng)的I/O設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)

電子工程師 ? 來(lái)源:工程網(wǎng) ? 2021-03-25 10:27 ? 次閱讀

引 言

在32位微處理器逐漸成為嵌入式系統(tǒng)主流的同時(shí),嵌入式應(yīng)用也變得越來(lái)越復(fù)雜。許多嵌入式系統(tǒng)都不得不借助于專用的操作系統(tǒng)來(lái)支撐自己的應(yīng)用。uClinux作為類(lèi)Unix操作系統(tǒng),繼承了Linux的各種優(yōu)秀的品質(zhì),成為首選的嵌入式系統(tǒng)的操作系統(tǒng)。

為自己的設(shè)備在操作系統(tǒng)下添加驅(qū)動(dòng)程序,是嵌入式設(shè)計(jì)必不可少的部分。針對(duì)不同的設(shè)備類(lèi)型,選擇合適的驅(qū)動(dòng)程序的模式,同樣也是十分重要的。通常的設(shè)備驅(qū)動(dòng)采用直接I/O的方式,如存儲(chǔ)器、看門(mén)狗等;而對(duì)于象網(wǎng)絡(luò)這樣的數(shù)據(jù)流設(shè)備的驅(qū)動(dòng),則應(yīng)該用到中斷機(jī)制。

本文以u(píng)Clinux為背景,以一種數(shù)據(jù)流設(shè)備為目標(biāo),介紹中斷驅(qū)動(dòng)的I/O設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)。

1 應(yīng)用背景

1.1 硬件描述

本文介紹的驅(qū)動(dòng)程序是應(yīng)用在一種電信E1線路和以太網(wǎng)互聯(lián)設(shè)備上的。它是旁路接收E1數(shù)據(jù)并將其發(fā)送到以太網(wǎng)的某一臺(tái)服務(wù)器上,在服務(wù)器上對(duì)E1的話路和信令時(shí)隙分析。

該設(shè)備中的處理器是采用三星公司出品的網(wǎng)絡(luò)型ARM處理器S3C4510B。E1線路接口采用Dallas半導(dǎo)體公司的專用El接口單元(LIU)芯片 DS2148,它完成波形整理、時(shí)鐘恢復(fù)和HDB3解碼。DS2148將整理后的E1數(shù)據(jù)流送給一片Altera公司的Cyclone系列的 FPGA(EPlC3T144C8),它將串行的E1數(shù)據(jù)流存入到FIFO,再通過(guò)ARM的32位外部總線將數(shù)據(jù)傳送給ARM。ARM將數(shù)據(jù)打包通過(guò)以太網(wǎng)發(fā)送到服務(wù)器上。圖l所示是本系統(tǒng)的硬件框圖。本文主要介紹接在ARM的外部總線上的FPGA,在uClinux下的驅(qū)動(dòng)程序中斷機(jī)制的設(shè)計(jì)。

1.2硬件連接

S3C4510B處理器和FPGA的連接電路如圖2所示。

以u(píng)Clinux為背景,介紹中斷驅(qū)動(dòng)的I/O設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)

以u(píng)Clinux為背景,介紹中斷驅(qū)動(dòng)的I/O設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)

1.3 FPGA內(nèi)FIFO的結(jié)構(gòu)

在FPGA內(nèi)部設(shè)置了兩個(gè)FIFO。為了防止ARM和FPGA操作的沖突,ARM和FPGA對(duì)兩個(gè)FIFO操作采用乒乓方式,這樣ARM和FPGA就可以同時(shí)操作不同的FIFO,而不需要等待。FIFO的大小是4096位,能容納一個(gè)E1復(fù)幀的數(shù)據(jù)量。當(dāng)FPGA將一個(gè)FIFO填滿后,會(huì)用中斷的方式通知ARM來(lái)讀FIFO,同時(shí)FPGA會(huì)置內(nèi)部的F1FO狀態(tài)寄存器。 FIFO)狀態(tài)寄存器命名為fpga_imf,是一個(gè)32位的寄存器,用其中某幾位置“l(fā)”,表示對(duì)應(yīng)的FIFO需要讀取。

2 軟件設(shè)計(jì)

中斷驅(qū)動(dòng)的I/O是指,輸人數(shù)據(jù)在中斷期間被填充到緩沖區(qū)內(nèi),并由讀取該設(shè)備的進(jìn)程取走緩沖區(qū)內(nèi)的數(shù)據(jù);輸出緩沖區(qū)由寫(xiě)設(shè)備的進(jìn)程填充,并在中斷期間取走數(shù)據(jù)。數(shù)據(jù)緩沖可以將數(shù)據(jù)的發(fā)送和接收與write及read系統(tǒng)調(diào)用分離開(kāi)來(lái),提高系統(tǒng)的整體性能。下面是uCllnux下的中斷程序的設(shè)計(jì)。

2.1 uClinux下的中斷程序

在uClinux系統(tǒng)中,通過(guò)調(diào)用下面這個(gè)函數(shù)向系統(tǒng)申請(qǐng)一個(gè)中斷通道(或中斷請(qǐng)求IRQ),并在處理完以后釋放掉它。

mt reqLIest_irq(unsigned int irq,void(*handler)(int,vold*,

struct pt_regs*),unsigned 10ng flags,const chat*device,

vold*dev_id);

void free_irq(unstgned int lrq,VOid*dev_id);

其中,irq是中斷號(hào)。在本系統(tǒng)中它對(duì)應(yīng)于S3C4510B的21個(gè)中斷源。這里用的是中斷源O。handler指向要安裝的中斷處理函數(shù)的指針。 flags是一個(gè)與中斷管理有關(guān)的各種選項(xiàng)的字節(jié)掩碼。device傳遞給request_irq的字符串,在/proc/interrupts中用于顯示中斷的擁有者。dev_id指針用于共享的中斷信號(hào)線。函數(shù)的返回值為O時(shí)表示成功,或者返回一個(gè)負(fù)的錯(cuò)誤碼。函數(shù)返回一EBUJSY通知另一個(gè)設(shè)備驅(qū)動(dòng)程序已經(jīng)使用了要申請(qǐng)的中斷信號(hào)線。下面是FPGA的設(shè)備中斷申請(qǐng)函數(shù)。這個(gè)函數(shù)是在驅(qū)動(dòng)中的fpga_open函數(shù)中被調(diào)用的。

int fpga_open(struct inode*inocle,stuct_file*file){

int result;

result=request_irq(FPGA_IRQ,δfpga_isr,SA_INTER-RUPT,″fpga″,NULL);

if(resuIt!=O){

printk(KERN_INFO”Can not register FPGA ISR!\n”);}else{

printk(KERN_INFO″FPGA ISR Register successfully!\n”);

}

}

在申請(qǐng)了中斷通道后,系統(tǒng)會(huì)響應(yīng)外部中斷0,而進(jìn)入中斷處理程序。中斷處理程序的第一步是要先清除S3C4510B的中斷懸掛寄存器的外部中斷O位。這是為了讓FPGA可以產(chǎn)生新的中斷。在uClinux系統(tǒng)中是調(diào)用下面的宏來(lái)實(shí)現(xiàn)的。

責(zé)任編輯:lq6

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5275

    瀏覽量

    119678
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3534

    瀏覽量

    128997
  • 微處理器
    +關(guān)注

    關(guān)注

    11

    文章

    2237

    瀏覽量

    82223
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    線路驅(qū)動(dòng)器的作用_線路驅(qū)動(dòng)器應(yīng)用背景

     線路驅(qū)動(dòng)器是一種電子設(shè)備,它在電路中起到至關(guān)重要的作用,主要用于增強(qiáng)信號(hào)的傳輸和驅(qū)動(dòng)能力。具體來(lái)說(shuō),線路驅(qū)動(dòng)器的作用可以歸納以下幾個(gè)方面
    的頭像 發(fā)表于 10-03 14:56 ?158次閱讀

    文檔更新 | 迅RK3568驅(qū)動(dòng)指南-第十七篇(串口)

    I2C 第166章 初步認(rèn)識(shí)I2C 第167章 I2C上拉電阻 第168章 I2C通信時(shí)序介紹 第169章
    發(fā)表于 09-24 10:42

    Linux 驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā),你知道多少?

    一、Linux驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā)的區(qū)別開(kāi)發(fā)層次不同:Linux驅(qū)動(dòng)開(kāi)發(fā)主要是針對(duì)硬件
    的頭像 發(fā)表于 08-30 12:16 ?372次閱讀
    Linux <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>與應(yīng)用<b class='flag-5'>開(kāi)發(fā)</b>,你知道多少?

    MSP430 I/O驅(qū)動(dòng)段式LCD設(shè)計(jì)說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《MSP430 I/O驅(qū)動(dòng)段式LCD設(shè)計(jì)說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 08-30 10:39 ?0次下載
    MSP430 <b class='flag-5'>I</b>/<b class='flag-5'>O</b>口<b class='flag-5'>驅(qū)動(dòng)</b>段式LCD設(shè)計(jì)說(shuō)明

    NCA9555帶中斷的16位I2C總線I/O端口英文手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《NCA9555帶中斷的16位I2C總線I/O端口英文手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 07-03 17:26 ?1次下載

    軟件可配置模擬 I/O 的設(shè)計(jì)理念

    作者: Kenton Williston 曾幾何時(shí),模擬 I/O 就是最專業(yè)、功能最固定的硬件。例如,電流驅(qū)動(dòng)器和電壓傳感器是完全不同的零件,試圖顛倒其角色可謂是荒謬至極。 軟件可配置模擬 I
    的頭像 發(fā)表于 05-05 11:10 ?673次閱讀
    軟件可配置模擬 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 的設(shè)計(jì)理念

    《RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》基礎(chǔ)篇--先楫bsp的hwtimer設(shè)備

    一、概述(一)RT-Thread設(shè)備驅(qū)動(dòng)《RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread官方出品撰寫(xiě),系統(tǒng)講解RT-threa
    的頭像 發(fā)表于 02-24 08:16 ?1208次閱讀
    《RT-Thread<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>指南》基礎(chǔ)篇--<b class='flag-5'>以</b>先楫bsp的hwtimer<b class='flag-5'>設(shè)備</b><b class='flag-5'>為</b>例

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南基礎(chǔ)篇—先楫bsp的hwtimer設(shè)備

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread官方出品撰寫(xiě),系統(tǒng)講解RT-thread IO設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 02-20 16:01 ?1510次閱讀
    RT-Thread<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>指南基礎(chǔ)篇—<b class='flag-5'>以</b>先楫bsp的hwtimer<b class='flag-5'>設(shè)備</b><b class='flag-5'>為</b>例

    為什么單片機(jī)I/O驅(qū)動(dòng)MOS管時(shí),不是直接驅(qū)動(dòng),而是經(jīng)過(guò)三極管

    為什么單片機(jī)I/O驅(qū)動(dòng)MOS管時(shí),不是直接驅(qū)動(dòng),而是經(jīng)過(guò)三極管 單片機(jī)I/O
    的頭像 發(fā)表于 01-16 11:14 ?2953次閱讀

    labview怎么添加設(shè)備驅(qū)動(dòng)

    添加設(shè)備驅(qū)動(dòng)是使用LabVIEW進(jìn)行設(shè)備控制和數(shù)據(jù)采集的關(guān)鍵步驟之一。本文將向您介紹如何在LabVIEW中添加設(shè)備
    的頭像 發(fā)表于 01-02 16:10 ?2023次閱讀

    經(jīng)緯恒潤(rùn)國(guó)產(chǎn)芯片MCAL軟件開(kāi)發(fā)賦能

    近日,經(jīng)緯恒潤(rùn)矽力杰半導(dǎo)體開(kāi)發(fā)的AutoSAR底層軟件MCAL成功交付。該MCAL產(chǎn)品基于矽力杰SA32Bxx系列5款芯片進(jìn)行開(kāi)發(fā),包含了MCU基礎(chǔ)驅(qū)動(dòng)、通信
    的頭像 發(fā)表于 12-27 08:00 ?639次閱讀
    經(jīng)緯恒潤(rùn)<b class='flag-5'>為</b>國(guó)產(chǎn)芯片MCAL軟件<b class='flag-5'>開(kāi)發(fā)</b>賦能

    Linux I/O 接口的類(lèi)型及處理流程

    設(shè)備、塊設(shè)備)進(jìn)行讀寫(xiě)操作的接口,包括 ioctl()、mmap()、select()、poll()、epoll() 等。 其他 I/O 接口:如管道接口、共享內(nèi)存接口、信號(hào)量接口等。
    的頭像 發(fā)表于 11-08 16:43 ?808次閱讀
    Linux <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 接口的類(lèi)型及處理流程

    Linux系統(tǒng)下I/O操作講解

    Linux系統(tǒng)下I/O 一、I/O簡(jiǎn)介 I/O(輸入/輸出)是在主存和外部
    的頭像 發(fā)表于 11-08 15:13 ?1035次閱讀
    Linux系統(tǒng)下<b class='flag-5'>I</b>/<b class='flag-5'>O</b>操作講解

    軟件中斷與硬件中斷的區(qū)別

    的理論知識(shí)。 硬件中斷: 硬件中斷是由某些硬件設(shè)備引起的,例如啟動(dòng) I/O 的請(qǐng)求、硬件故障或類(lèi)似的事情。引入硬件
    的頭像 發(fā)表于 11-07 16:52 ?952次閱讀
    軟件<b class='flag-5'>中斷</b>與硬件<b class='flag-5'>中斷</b>的區(qū)別

    RK3568外部IO中斷示例

    ?外部IO中斷介紹本篇文章萬(wàn)象奧科HD-RK3568-IOT評(píng)估板中GPIO30例,介紹Linux內(nèi)核
    的頭像 發(fā)表于 11-03 13:56 ?841次閱讀
    RK3568外部IO<b class='flag-5'>中斷</b>示例