999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

QNX系統(tǒng)中基于AM3352的多串口通信驅(qū)動設(shè)計(jì)

2018-09-07 02:31:52

(國電南京自動化股份有限公司,南京210032)

引 言

圖1 多串口電路設(shè)計(jì)

串口通信具有穩(wěn)定可靠、簡單易實(shí)現(xiàn)的特點(diǎn),因此在自動化領(lǐng)域有著廣泛的應(yīng)用。以一個智能變電站的通信管理服務(wù)器為例,需要設(shè)計(jì)一路調(diào)試口和多路規(guī)約通信口,同時還要支持多個串口外設(shè),由于CPU本身提供的串口資源有限,往往不能滿足上述的設(shè)計(jì)需求,而通過在FPGA上設(shè)計(jì)出支持串口協(xié)議的IP核則可以很容易地對串口進(jìn)行擴(kuò)展,解決CPU串口資源不足的問題。

1 原理設(shè)計(jì)

本方案用AM3352作為主控CPU,AM3352是一款基于ARM Cortext-A8內(nèi)核的微處理器,主頻最高支持720 MHz,運(yùn)算能力高達(dá)1 600 DMIPS,具有豐富的外圍接口,帶6路異步串口,能搭配DDR3,支持大容量的eMMC和NAND FLASH。圖1 給出了基于AM3352的多串口電路設(shè)計(jì)示意圖,AM3352提供了6路本機(jī)串口UART0~UART5,另2路串口通過FPGA進(jìn)行擴(kuò)展。為FPGA設(shè)計(jì)了支持串口協(xié)議的IP核,對IP核進(jìn)行實(shí)例化,實(shí)現(xiàn)了擴(kuò)展串口UART7~UART8。AM3352 利用GPMC接口連接FPGA,實(shí)現(xiàn)對擴(kuò)展串口的控制,同時將中斷請求資源GPIO3_16、GPIO3_17分別分配給UART7和UART8,由FPGA通過中斷的方式通知CPU讀取接收緩存區(qū)存放的數(shù)據(jù)。

在串口IP核里按圖2設(shè)計(jì)了寄存器組和存儲器,存儲器Tx_Mem和Rx_Mem用于緩存發(fā)送數(shù)據(jù)和接收數(shù)據(jù),寄存器Tx_Len存儲有效發(fā)送數(shù)據(jù)長度用于CPU通知FPGA要發(fā)送的字節(jié)數(shù),寄存器Rx_Len存儲有效接收數(shù)據(jù)長度,用于FPGA告訴CPU放在接收緩存區(qū)Rx_Mem可被讀取的字節(jié)數(shù),寄存器BUGR用于擴(kuò)展串口通信速率的設(shè)置,寄存器IER用于中斷使能的配置,寄存器IFR標(biāo)識中斷源,中斷響應(yīng)后應(yīng)由中斷服務(wù)程序?qū)ζ湎鄳?yīng)位置0予以清除中斷。

圖2 擴(kuò)展串口地址空間分配

2 QNX系統(tǒng)簡介

QNX是類UNIX操作系統(tǒng),由加拿大QSSL公司(QNX Software System Ltd.)開發(fā)的分布式實(shí)時操作系統(tǒng)。它采用獨(dú)特的微內(nèi)核結(jié)構(gòu),由內(nèi)核實(shí)現(xiàn)進(jìn)程通信、進(jìn)程調(diào)度、中斷處理和底層網(wǎng)絡(luò)通信,因此內(nèi)核非常小,運(yùn)行速度極快。將驅(qū)動程序、應(yīng)用程序、網(wǎng)絡(luò)協(xié)議和文件系統(tǒng)的運(yùn)行地址空間同內(nèi)核的運(yùn)行地址空間進(jìn)行分離,使得應(yīng)用程序無法直接訪問內(nèi)核空間,這種封閉的微內(nèi)核結(jié)構(gòu)保證了任何外部模塊的故障都不會影響內(nèi)核的運(yùn)行,從而使系統(tǒng)的穩(wěn)定性大大提高。同時,QNX支持裁剪和擴(kuò)展,能針對用戶需求定制不同的功能模塊,實(shí)現(xiàn)靈活的嵌入式開發(fā)。

3 硬件配置

由于要通過GPMC模塊控制FPGA來實(shí)現(xiàn)對擴(kuò)展串口的訪問控制,因此需要在驅(qū)動工作前完成對GPMC接口的配置,配置代碼放在startup里,由startup設(shè)置GPMC接口的位寬、控制時鐘、訪問時序等,將GPMC_AD0~GPMC_AD15設(shè)置成地址數(shù)據(jù)復(fù)用的工作模式,并把起始地址0x100 0000的16 MB地址空間分配給擴(kuò)展串口設(shè)備。具體配置代碼如下:

out32(GPMC_CONFIG1_0, 0x2a001200);

/*NOR設(shè)備,GPMC_CLK配置成50 MHz*/

out32(GPMC_CONFIG2_0, 0x000a0a00);/*CS時序控制*/

out32(GPMC_CONFIG3_0, 0x00020201);/*ADV時序控制*/

out32(GPMC_CONFIG4_0, 0x04020602);/*OE WE時序控制*/

out32(GPMC_CONFIG5_0, 0x00040a0a);/*讀寫訪問時序*/

out32(GPMC_CONFIG6_0, 0x030201c0);

out32(GPMC_CONFIG7_0, 0x00000F41);

/*16M地址空間,CS有效電平,基地址0x1000000*/

由于要用GPIO3_16、GPIO3_17產(chǎn)生中斷請求信號,接下來需要對中斷資源進(jìn)行配置。AM3352提供了128個中斷信號,而GPIO3位于第62個中斷源,所以要對中斷信號62進(jìn)行級聯(lián),將級聯(lián)后的起始中斷號設(shè)置成130,從而可知GPIO3_16對應(yīng)的中斷號是146,GPIO3_17對應(yīng)的中斷號是147。此外,還需要向系統(tǒng)提供中斷相關(guān)的callout函數(shù),在此定義了id callout函數(shù)interrupt_id_am335x_gpio用于系統(tǒng)獲取中斷號、屏蔽和并清除中斷,定義了eio callout函數(shù)interrupt_eoi_am335x_gpio用于中斷服務(wù)程序結(jié)束后重新開放中斷,定義了mask callout函數(shù)interrupt_mask_am335x_gpio用于屏蔽中斷,定義了unmask callout函數(shù)interrupt_unmask_am335x_gpio用于開放中斷。具體的中斷信息結(jié)構(gòu)體按下面代碼定義:

const static struct startup_intrinfo intrs[] =

{

{

_NTO_INTR_CLASS_EXTERNAL, /* vector base*/

128,

/* number of vectors*/

_NTO_INTR_SPARE, /* cascade vector*/

0, /* CPU vector base*/

0, /* CPU vector stride*/

0, /* flags*/

{INTR_GENFLAG_LOAD_SYSPAGE, 0, &interrupt_id_am335x},

{INTR_GENFLAG_LOAD_SYSPAGE | INTR_GENFLAG_LOAD_INTRMASK, 0, &interrupt_eoi_am335x},

&interrupt_mask_am335x, /*maskcallout*/

&interrupt_unmask_am335x, /*unmask callout*/

0, /*config callout*/

&am335x_intc_base

},

/* GPIO3 interrupt*/

{

130, /*vector base*/

32, /* number of vectors*/

62, /* cascade vector*/

0, /*CPU vector base*/

0, /* CPU vector stride*/

0, /* flags*/

{ 0, 0, &interrupt_id_am335x_gpio},

{ INTR_GENFLAG_LOAD_INTRMASK, 0, &interrupt_eoi_am335x_gpio},

&interrupt_mask_am335x_gpio, /* mask callout*/

&interrupt_unmask_am335x_gpio, /* unmask callout*/

0,

/* config callout*/

&am335x_gpio3_base

},

};

中斷請求到來后,內(nèi)核首先調(diào)用第一級id callout函數(shù), 返回第一級ID,因?yàn)橛屑壜?lián),內(nèi)核會自動調(diào)用級聯(lián)id callout函數(shù)返回級聯(lián)ID,緊接著調(diào)用通過InterruptAttach綁定在級聯(lián)ID上的中斷服務(wù)函數(shù)interrupt handler處理用戶任務(wù),最后調(diào)用eoi callout重新開放中斷。如果是通過調(diào)用InterruptAttachEvent進(jìn)行中斷綁定,內(nèi)核會先調(diào)用mask callout屏蔽中斷, 此時必須由驅(qū)動程序在中斷響應(yīng)函數(shù)里調(diào)用InterruptUnmask即unmask callout,重新使能中斷。

4 QNX下的串口驅(qū)動

4.1 驅(qū)動工作原理

串口工作過程見圖3。串口屬于字符設(shè)備,由io-char進(jìn)行統(tǒng)一管理。用戶進(jìn)程通過write將數(shù)據(jù)寫到數(shù)據(jù)發(fā)送隊(duì)列obuf,驅(qū)動調(diào)用函數(shù)tto將obuf隊(duì)列里的數(shù)據(jù)發(fā)送給串口,從而實(shí)現(xiàn)了數(shù)據(jù)的發(fā)送。接收過程則由中斷發(fā)起,CPU響應(yīng)中斷,最終進(jìn)入串口驅(qū)動提供的中斷服務(wù)程序讀取串口數(shù)據(jù),并調(diào)用函數(shù)tti將讀取的數(shù)據(jù)寫到數(shù)據(jù)接收隊(duì)列ibuf,用戶進(jìn)程便可通過read讀取ibuf隊(duì)列中的數(shù)據(jù)。

圖3 串口驅(qū)動工作原理

4.2 驅(qū)動初始化

初始化程序?qū)⒋谠O(shè)置成RAW工作模式,然后解析命令行參數(shù),從命令行參數(shù)獲取波特率、時鐘等參數(shù),接著創(chuàng)建字符串設(shè)備并注冊設(shè)備名,使設(shè)備在命名空間中產(chǎn)生相應(yīng)的名稱,隨后對串口進(jìn)行配置、設(shè)置通信速率, 調(diào)用InterruptAttach綁定中斷服務(wù)函數(shù)并開啟中斷,之后系統(tǒng)便進(jìn)入消息循環(huán)處理,等待并響應(yīng)中斷請求。為了區(qū)分串口,在設(shè)備描述結(jié)構(gòu)體里定義了dev_id成員用于記錄設(shè)備ID,由設(shè)備創(chuàng)建函數(shù)create_device對ID賦值。驅(qū)動初始化流程見圖4。

圖4 初始化流程圖

4.3 接收過程

接收過程由中斷服務(wù)程序?qū)崿F(xiàn)。對于擴(kuò)展串口,F(xiàn)PGA將接收到的數(shù)據(jù)緩存到Rx_Mem,將有效數(shù)據(jù)長度寫到Rx_Len,同時通過GPIO3_16或GPIO3_17向CPU發(fā)出中斷請求信號,CPU響應(yīng)中斷請求并進(jìn)入中斷服務(wù)程序,在中斷服務(wù)程序里調(diào)用系統(tǒng)函數(shù)tti將接收緩存區(qū)Rx_Mem中的有效數(shù)據(jù)放到數(shù)據(jù)接收隊(duì)列ibuf,隨后應(yīng)用程序便可通過read讀取ibuf中的數(shù)據(jù)。

對于本機(jī)串口,數(shù)據(jù)準(zhǔn)備好后由串口控制器產(chǎn)生中斷請求,CPU響應(yīng)中斷請求并進(jìn)入中斷服務(wù)程序,由中斷服務(wù)程序調(diào)用tti函數(shù),讀取接收保持寄存器RHR里的數(shù)據(jù)并送到接收隊(duì)列ibuf供應(yīng)用程序讀取。

4.4 發(fā)送數(shù)據(jù)及tto函數(shù)

發(fā)送數(shù)據(jù)由系統(tǒng)調(diào)用tto函數(shù)實(shí)現(xiàn)。tto函數(shù)通過調(diào)用系統(tǒng)函數(shù)tto_getchar從obuf隊(duì)列獲取待發(fā)送的數(shù)據(jù),對于本機(jī)串口需將待發(fā)送數(shù)據(jù)寫到發(fā)送保持寄存器THR啟動數(shù)據(jù)發(fā)送,對于擴(kuò)展串口需要將待發(fā)送數(shù)據(jù)寫到發(fā)送緩存區(qū)Tx_Mem,然后將有效數(shù)據(jù)長度寫到Tx_Len寄存器啟動FPGA發(fā)送數(shù)據(jù)。

tto函數(shù)除了實(shí)現(xiàn)發(fā)送數(shù)據(jù)外,還實(shí)現(xiàn)了串口參數(shù)設(shè)置命令STTY、流控制命令CTRL和設(shè)備狀態(tài)檢測命令LINESTATUS。很多設(shè)備都帶有打印機(jī),為了避免打印機(jī)出現(xiàn)打印亂碼,需要在驅(qū)動里實(shí)現(xiàn)LINESTATUS命令對打印機(jī)端口CTS進(jìn)行監(jiān)視,這樣打印服務(wù)程序就可以通過調(diào)用devctl(fd,DCMD_CHR_LINESTATUS,&dat,4,NULL)檢測打印機(jī)是否準(zhǔn)備就緒,待打印機(jī)準(zhǔn)備好后方能向打印口寫數(shù)據(jù)。

5 腳本配置

驅(qū)動程序編寫好后還需要配置腳本文件,通過腳本啟動串口設(shè)備。腳本配置如下:

devc-seromap-F-S-u1-b115200-c48000000 0x44E09000^2,72 0x48022000^2,73 0x48024000^2,74 0x481A6000^2,44 0x481A8000^2,45 0x481AA000^2,46 0x1000000^2,146 0x1000300^2,147

運(yùn)行腳本后便在/dev下生成了對應(yīng)于串口UART0~UART7的設(shè)備文件ser1~ser8。為了方便系統(tǒng)調(diào)試,往往將UART0配置成console,因此需在上面腳本后添加“reopen/dev/ser1”。

結(jié) 語

許學(xué)芳、羅銘(工程師),主要研究方向?yàn)殡娏ο到y(tǒng)主設(shè)備繼電保護(hù)。

主站蜘蛛池模板: 一本无码在线观看| 天天综合网站| 国产精品视频3p| 成年午夜精品久久精品| 在线观看国产精品日本不卡网| 亚洲综合在线网| 久久久久久尹人网香蕉| a亚洲天堂| 日韩毛片基地| 精品福利一区二区免费视频| 久久一级电影| 亚洲有无码中文网| 中文字幕色站| 欧美午夜网| 国产精品欧美亚洲韩国日本不卡| 日韩资源站| 亚洲AV电影不卡在线观看| 精品福利国产| 欧美一级在线| 国产一级在线播放| 欧美翘臀一区二区三区| 欧美日韩免费在线视频| 在线观看91精品国产剧情免费| 日韩黄色大片免费看| 国内精品小视频福利网址| 精品视频91| jizz在线观看| 国产一级妓女av网站| 成年人视频一区二区| 午夜福利视频一区| 九九香蕉视频| 久久婷婷色综合老司机| 亚洲三级成人| 亚洲天堂久久久| 国产视频 第一页| 青青青视频蜜桃一区二区| 国产成人久视频免费| 无遮挡国产高潮视频免费观看 | 日韩精品亚洲人旧成在线| 精品国产亚洲人成在线| 久久99国产综合精品女同| 中文国产成人精品久久| 国产精品jizz在线观看软件| 亚洲精品午夜天堂网页| 亚洲成人精品在线| 精品国产Ⅴ无码大片在线观看81| 福利国产微拍广场一区视频在线| 精品一区二区无码av| 欧美精品在线看| 欧美三级自拍| 国产特一级毛片| 亚洲h视频在线| 日韩无码视频网站| 成人福利在线看| 中文字幕在线播放不卡| 亚洲天堂精品在线观看| 亚洲日韩高清在线亚洲专区| 四虎亚洲精品| 538国产视频| jizz国产视频| 国产呦视频免费视频在线观看| 亚洲精品不卡午夜精品| 色婷婷狠狠干| 玖玖免费视频在线观看| 国产午夜人做人免费视频中文 | 国产精品网址在线观看你懂的| 亚洲中文精品人人永久免费| 久久精品国产999大香线焦| 国内自拍久第一页| 久久亚洲精少妇毛片午夜无码| 国产精品久久久久鬼色| 免费亚洲成人| 久久人妻xunleige无码| 欧美福利在线观看| 日韩欧美国产精品| 国产精品无码制服丝袜| 色噜噜在线观看| 亚洲欧美自拍一区| 在线中文字幕网| 免费又爽又刺激高潮网址 | 伊人久久青草青青综合| 在线亚洲精品自拍|