版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
linuxUART內(nèi)容介紹:Linux下的串口驅(qū)動(dòng)的設(shè)計(jì)層次及接口,TTY終端之間的關(guān)聯(lián)層次(TTY終端使用Linux下的中斷解決機(jī)制/中斷共享機(jī)制,尚有串口緩沖機(jī)制當(dāng)中涉及的軟中斷機(jī)制;w83697/w83977IC方面的知識(shí),具體參考有關(guān)手冊(cè),對(duì)串口的配備寄存器有具體介紹,本文不再進(jìn)行闡明.目錄索引一Linux的串口接口及層次二Linux的中斷機(jī)制及中斷共享機(jī)制三Linux的軟中斷機(jī)制四TTY與串口的具體關(guān)聯(lián)一Linux的串口接口及層次串口是使用已經(jīng)非常廣的設(shè)備了,linux下面的支持已經(jīng)很完善了,含有統(tǒng)一的編程接口,IC來做完畢對(duì)應(yīng)的配備宏,這此配備宏涉及讀與寫中斷打開與關(guān)閉(如傳送與接受中斷接受狀態(tài)解決有FIFO時(shí)還要解決FIFO的狀態(tài)以下我們就首先切入這一部分IC有關(guān)的部分在驅(qū)動(dòng)中的解決,這一部分能夠說是串口驅(qū)動(dòng)中的最基礎(chǔ)部分直接與硬件打交道完畢最底層具體的串口數(shù)據(jù)傳W83697:0x00001K空間.W839770x300000001K空間由于串口設(shè)備的特殊性,能夠當(dāng)作終端使用,但是終端的使用在內(nèi)核尚未完全初始化之前(有關(guān)串口與終端的關(guān)聯(lián)及層次在第四節(jié)中具體),mem_init()建立內(nèi)核的虛存管理機(jī)制,因此不能通過ioreamp來進(jìn)行物理內(nèi)存到虛存的映射(物理內(nèi)存必須由內(nèi)核映射成系統(tǒng)管理的虛擬內(nèi)存后才干進(jìn)行讀寫訪問這與先前所講的framebuffer的物理內(nèi)存映射是不同的,start_kernelrest_init→init(內(nèi)核初始線程)do_basic_setupdo_initcalls→(Linux下用setup啟動(dòng)早期初始機(jī)制與initcallIO_BASE_VIRTIO_SIZE./*WhereinvirtualmemorytheIOdevices(timers,system*andsoon).Thisgetsusedinarch/arm/mach-ep93xx/mm.c.*/#defineIO_BASE_VIRT0xFF000000//VirtualaddressofIO#defineIO_BASE_PHYS0x80000000//PhysicaladdressofIO#defineIO_SIZE0x00A00000//Howmuch?完畢映射的函數(shù)是ep93xx_map_io全部要進(jìn)行映射內(nèi)存都在ep93xx_io_desc構(gòu)造當(dāng)中描文獻(xiàn)linux-2.4.21/include/asm-arm/arch-ep93xx/regmap.h#defineIO_W83697_UART_BASE0x0000#defineIO_W83697_UART_SIZE0x1000#defineIO_W83977_UART_BASE0x30000000#defineIO_W83977_UART_SIZE0x1000#defineIO_SIZE_2(IO_SIZE+0x100000)#defineIO_BASE83697_VIRTIO_BASE_VIRT+IO_SIZE#defineIO_BASE83977_VIRTIO_BASE_VIRT+IO_SIZE_2ep93xx_map_ioarchstructmachine_descmdesc這個(gè)機(jī)器描述構(gòu)造體,mach-ep93xxarch.c文獻(xiàn)中以下宏完畢此構(gòu)造的初始化:MACHINE_START(EDB9302,"edb9302")MAPIO(ep93xx_map_io初始化map_io=console_init調(diào)用之前,因此不會(huì)有問題,此種辦4k一頁,最后調(diào)用的是create_mapping(),mach_ep93xx/mm/→獻(xiàn)中查找"."節(jié)的arm920_proc_infoprocess有關(guān)的操作函armARM內(nèi)存管理的有關(guān)手冊(cè)..section".",#alloc,.type.long.long.sizearm920_proc_info,.-/*pgtable.word.word.word以下,下面將詳術(shù)以下,并指出其具體被使用的環(huán)境上下文<1>.讀寫數(shù)據(jù)#defineUART_PUT_CHAR(p,c)writeb((c),(p)->membase+W83697_UARTDR)<2>.接受發(fā)送狀態(tài)#defineUART_GET_RSR(p)((readb((p)->membase+W83697_UARTRSR))&0xff)#defineUART_PUT_RSR(p,c)writeb((c),(p)->membase+W83697_UARTRSR)<3>.發(fā)送及接受中斷狀態(tài)#defineUART_GET_CR(p)((readb((p)->membase+W83697_UARTCR))&0xff)#defineUART_PUT_CR(p,c)writeb((c),(p)->membase+W83697_UARTCR)&0xff)<4>.以及其它的中斷使能設(shè)立等,在傳送時(shí)打開傳送中斷即會(huì)產(chǎn)生傳送中斷#defineUART_PUT_ICR(p,c)writeb((c),(p)->membase+<5>FIFO的狀態(tài)與否讀空/與否寫滿每次讀時(shí)必須讀至FIFO空寫時(shí)必須等到FIFO不滿時(shí)才干寫(要等硬件傳送完).status=while(UART_RX_DATA(status)&&max_count--)}發(fā)送中斷寫FIFO:當(dāng)發(fā)送緩沖區(qū)中有數(shù)據(jù)要傳送時(shí)置發(fā)送中斷使能隨即即產(chǎn)生傳送中斷此FIFO為空,FIFO大小的字節(jié),如果發(fā)送緩沖區(qū)數(shù)據(jù)傳完,則關(guān)閉發(fā)送中斷.<6>.傳送時(shí)可直接寫串口數(shù)據(jù)口,而不使用中斷,FIFO的狀態(tài)do{status=}while(!UART_TX_READY(status));//waitfortxbuffernotLINUX中的中斷共享支持.√串口時(shí)鐘串口時(shí)鐘用來轉(zhuǎn)換計(jì)算須要設(shè)立到配備寄存器當(dāng)中的波特率比值,其計(jì)算辦法為:quot(port->uartclk(16*baud));baud115200等值取決于所選的串口時(shí)鐘源,quot即為要設(shè)立到寄存器當(dāng)中的比值.√串口基址,即串口全部配備寄存器基礎(chǔ)址w83697的三個(gè)串口對(duì)應(yīng)中斷以下:uart1:00x3F8,uart2:00x2F8,uart3:00x3e8,uart4:00x3e8,EGPIO[8].w83977的兩個(gè)串口對(duì)應(yīng)中斷以下:uart1:00x3F8,uart2:00x2F8,port的定義以下{.port=.membase=(void.mapbase=.iotype=.irqW83697_IRQ_UART4//.uartclk1846100,//uart時(shí)鐘,默認(rèn).fifosize8,//fifo大小.ops&amba_pops,//底層驅(qū)動(dòng)的硬件操作集,如開關(guān)中斷等.flags=.line3,//0計(jì)起.dtr_mask=.rts_mask=}有關(guān)文獻(xiàn):linux-2.4.21/drivers/serial/core.c下面詳述.函數(shù)w83697uart_rx_chars(structuart_port*portstructpt_regs描述:串口接受數(shù)據(jù)中斷,此函數(shù)中應(yīng)當(dāng)注意的要點(diǎn)以下flip放在flag_buf_ptr當(dāng)中,標(biāo)志類型有TTY_NORMAL/TTY_PARITYTTY_FRAME等,據(jù)往上傳輸至終端終沖區(qū),隊(duì)列任務(wù)的機(jī)制將在背面介紹,它是一種異步執(zhí)行機(jī)制,在函數(shù)staticvoidw83697uart_tx_chars(structuart_port描述串口發(fā)送數(shù)據(jù)中斷發(fā)送中斷中要做的事比較少,比起接受中斷簡(jiǎn)樸了好多,注意事項(xiàng)以數(shù)據(jù)即退出uart_flush_chars()檢測(cè)當(dāng)沒有數(shù)據(jù)要傳輸?shù)臅r(shí)候,關(guān)閉傳送中斷,在傳送之前與傳送完之后都有檢測(cè)WAKEUP_CHARS,則能夠順帶介紹開關(guān)中斷接口staticvoidw83697uart_start_tx(structuart_port*port,unsignedinttty_start)staticvoidw83697uart_stop_tx(structuart_port*port,unsignedinttty_stop)函數(shù)staticvoidw83697uart_int(intirq,void*dev_id,structpt_regs描述3分為以下幾個(gè)接受中斷傳送中斷其它不具體解決的中斷,必須讀對(duì)應(yīng)寄存器清中斷函數(shù)staticvoidw83697uart_int2(intirqvoid*dev_idstructpt_regs中斷向量GPIO串口的參數(shù),GPIOw83697uart_int2決函數(shù)staticintw83697uart_startup(structuart_port函數(shù)staticvoidw83697uart_shutdown(structuart_port描述:串口關(guān)閉函數(shù),去除配備,半閉中斷函數(shù)staticvoidw83697uart_change_speed(structuart_port*port,unsignedintcflag,unsignedintiflag,unsignedintquot)文獻(xiàn)linux-這一層接口是串口驅(qū)動(dòng)中的共用部分代碼核心構(gòu)造為structuart_driver這一層上承TTY終完畢structuart_amba_portamba_ports的.opsportuart_driver當(dāng)中完畢關(guān)聯(lián),uart_add_one_port加入.staticintinit{intret,ret=uart_register_driver(&amba_reg);if(ret==0){for(i=0;i<UART_NR;i++)uart_add_one_port(&amba_reg,&amba_ports[i].port);}return}二Linux的中斷機(jī)制及中斷共享機(jī)制組當(dāng)中的一項(xiàng),structirqdescstructirqactionr的組員action,IBMdeveloperWorksstructirqactionvoid(*handler)(int,void*,structpt_regs*);unsignedlongflags;unsignedlongmask;constchar*name;void*dev_id;structirqaction從上面的構(gòu)造體與圖當(dāng)中,我們就能夠很清晰的看到,一種中斷向量表能夠?qū)?yīng)一種irqaction,irqaction,這當(dāng)中重要在安裝中斷的時(shí)候通過中斷retval=request_irq(port->irq,w83697uart_int,0,"w83697_uart3",retval=request_irq(port->irq,w83697uart_int2,SA_SHIRQ,"w83977_uart5",port);由上即可知,安裝共享中斷時(shí),只須指定安裝的中斷標(biāo)志位flag為SA_SHIRQ進(jìn)入分析安裝三Linux的軟中斷機(jī)制LINUX內(nèi)核本身應(yīng)用非常的廣它作為一種軟性的異步執(zhí)行機(jī)制,只有進(jìn)一步能更加明白串口驅(qū)動(dòng)某些問題,現(xiàn)在先提出幾個(gè)問題以下:flip緩沖區(qū)當(dāng)中,這樣讓人很容易進(jìn)一步想懂得,的數(shù)據(jù)與否傳送完畢?顧客空間的寫串口進(jìn)程處在什么樣的狀態(tài)?如果是寫完緩沖區(qū)U使用率,那么何時(shí)才應(yīng)當(dāng)醒過來?由誰負(fù)責(zé)醒過來?根據(jù)以上這兩個(gè)問題,我們來進(jìn)一步代碼分析,首先看接受緩沖區(qū)中的數(shù)據(jù)如何上傳,前面已tty_flip_buffer_push(),這個(gè)函數(shù)完畢的功效就是voidtty_flip_buffer_push(structtty_struct{if(tty->low_latency)flush_to_ldisc((void*)tty);queue_task(&tty->flip.tqueue,}tq_timer的執(zhí)行途徑分析tq_timer是一種雙鏈表構(gòu)造任務(wù)隊(duì)列,每項(xiàng)任務(wù)包含一種函數(shù)指針組員,它通過run_task_queue每次將當(dāng)中的全部任務(wù)(其實(shí)是某些函數(shù)指針)全部調(diào)用一次,然后清空隊(duì)列,tq_timertqueue_bh中執(zhí)行,以下:void{}在voidinitsched_init(void)當(dāng)中初始化底半的向量如,tqueue_bh初始化在bh_base的init_bh(TIMER_BH,timer_bh);init_bh(TQUEUE_BH,tqueue_bh);init_bh(IMMEDIATE_BH,immediate_bh);voidinit_bh(intnr,void(*routine)(void)){bh_base[nr]=routine;}staticvoidbh_action(unsignedlongnr){…if(bh_base[nr])…}bh_basebh,意即中斷底半所做的事tq_timer調(diào)用的任務(wù)tasklet機(jī)制,背面將進(jìn)行簡(jiǎn)樸介紹.voidinitsoftirq_init(){intfor(i=0;i<32;i++)tasklet_init(bh_task_vec+i,bh_action,i);}do_timer()mark_bh(TIMER_BH),來激時(shí)鐘taskletbh_task_vecbh_action.staticinlinevoidmark_bh(intnr){}tasklet的機(jī)制簡(jiǎn)樸分析structvoid(*action)(structsoftirq_action*);void*data;staticstructsoftirq_actionsoftirq_vec[32cacheline_aligned軟中斷的中斷向量[1].初始化軟中斷向量中斷,但是各處所完畢的功效不同,因此分在兩個(gè)軟中斷完畢,背面我們僅取其中用于執(zhí)行時(shí)HI_SOFTIRQ為例進(jìn)行解說,tasklet有關(guān)機(jī)制,這兩項(xiàng)軟中斷的實(shí)始化以下:voidinit{open_softirq(TASKLET_SOFTIRQ,tasklet_action,NULL);open_softirq(HI_SOFTIRQ,tasklet_hi_action,NULL);}open_softirq下所做的事相稱簡(jiǎn)樸,即往軟中斷向量中賦值,voidopen_softirq(intnr,void(*action)(structsoftirq_action*),void{softirq_vec[nr].data=data;softirq_vec[nr].action=action;}[2].HI_SOFTIRQtasklet_hi_action由上文所講的初始化過程給NR_CPUS=1.structtasklet_headtasklet_hi_vec[NR_CPUS]cacheline_aligned;[3].tasklettasklet,加在尾部.voidtasklet_hi_schedule(structtasklet_struct{…t->next=tasklet_hi_vec[cpu].list;tasklet_hi_vec[cpu].list=t;cpu_raise_softirq(cpu,HI_SOFTIRQ);…}#definecpu_raise_softirq(cpu,nr)do{softirq_pending(cpu)|=1UL<<(nr);}while(0)[4].軟中斷所依賴的執(zhí)行機(jī)制講到最后還沒有指出軟中斷是如何觸發(fā)執(zhí)行的,其實(shí)很簡(jiǎn)樸ksoftirqd(),這個(gè)線程解決軟中斷級(jí)別是比較do_softirq()中有以下的判斷,以決定與否有軟中斷須要執(zhí)行,如果沒有就直接退出,在[3]中提到的激活軟中斷時(shí)32pending=softirq_pending(cpu);if(pending){}do321的…if(pending&1)pending>>=}while[4].軟中斷所依賴的執(zhí)行時(shí)期問題if(in_interrupt())/*Areweinaninterruptcontext?Eitherdoingbottom*orhardwareinterrupt#definein_interrupt()({constintcpu=smp_processor_id();(local_irq_count(cpu)+local_bh_count(cpu)!=0);})/*softirq.hissensitivetotheoffsetsofthesefields*/typedefstruct{unsignedintsoftirq_pending;unsignedintlocal_irq_count;unsignedintlocal_bh_count;unsignedintsyscall_count;structtask_struct*ksoftirqd_task;/*waitqueueistoolarge} cacheline_aligned#defineirq_enter(cpu,irq)(local_irq_count(cpu)++)#defineirq_exit(cpu,irq)(local_irq_count(cpu)--)看到這里,不得不再多注意一種構(gòu)造,那就是irq_cpustat_t先前我們講與否有軟中斷產(chǎn)生的標(biāo)志位,但沒有提到softirq_pending32一種軟中斷對(duì)應(yīng)一種位;do_softirq中有以下幾個(gè)重要的動(dòng)作,闡明以下:,irq_exit表達(dá)已經(jīng)完畢解決;pending判斷與否有軟中斷須要解決,每個(gè)位用作當(dāng)作一種軟中斷與否產(chǎn)生的標(biāo)志去除全部軟中斷標(biāo)志位,由于下面即將解決;但去除之前先緩存起來,由于下面還要使打開硬件中斷,讓軟中斷在有硬件中斷的環(huán)境下執(zhí)行刻解決本次軟中斷過程未發(fā)生過的軟中斷向量.之因此會(huì)有新的軟中斷產(chǎn)生,那是由于軟中斷是在開硬件中斷的狀況下執(zhí)行,硬件中斷解決是可能又產(chǎn)生了新的軟中斷.之因asmlinkagevoid{intcpu=u32pending;unsignedlongflags;u32if(in_interrupt())return;pending=softirq_pe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房產(chǎn)交易稅費(fèi)繳納與申報(bào)合同范本3篇
- 城市軌道交通建設(shè)運(yùn)營(yíng)服務(wù)合同
- 二零二五年度勞動(dòng)社會(huì)保險(xiǎn)合同(殘疾人士)3篇
- 2025軟件開發(fā)合同模版
- 2025橫向項(xiàng)目合同書范文
- 校園文化活動(dòng)策劃師合同樣本
- 地?zé)崮荛_發(fā)鉆井合同
- 音響設(shè)備買賣合同調(diào)解
- 教育科技合同履行準(zhǔn)則
- 港口碼頭招投標(biāo)廉政合同模板
- 《流感科普宣教》課件
- 紅領(lǐng)巾知識(shí)伴我成長(zhǎng)課件
- 廚邦醬油推廣方案
- 乳腺癌診療指南(2024年版)
- 腦血管病的三級(jí)預(yù)防
- 保險(xiǎn)產(chǎn)品創(chuàng)新與市場(chǎng)定位培訓(xùn)課件
- 2022-2023學(xué)年山東省淄博四中高二(上)期末數(shù)學(xué)試卷含答案
- 《建筑賦比興》一些筆記和摘錄(上)
- 時(shí)間管理的原則與方法
- 【A公司人力資源招聘管理問題及優(yōu)化建議分析13000字(論文)】
- 鋼結(jié)構(gòu)牛腿計(jì)算
評(píng)論
0/150
提交評(píng)論