国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

Linux串口驅(qū)動(dòng)移植的一些心得總結(jié)

發(fā)布時(shí)間:2018-9-15 11:46    發(fā)布者:xyd2018
串口驅(qū)動(dòng)的源文件一般是使用drivers/serial/8250.c文件,或該文件的稍作修改。這是因?yàn)榇蠖嗟拇诮涌诘牟僮骷拇嫫鞫际欠舷嚓P(guān)的定義,都是基本一樣的。那么在移植串口驅(qū)動(dòng)時(shí),一般是為該驅(qū)動(dòng)添加我們的串口接口設(shè)備。一般來說,串口接口設(shè)備在board文件中添加或在板級(jí)目錄下添加專屬的serial文件。

設(shè)備的定義一般如下:
struct plat_serial8250_port serial_std_platform_data[] = {
{
.membase = (void *) io_p2v(UART5_BASE),
.mapbase = UART5_BASE,
.irq = IRQ_UART_IIR5,
.uartclk = MAIN_OSC_FREQ,
.regshift = 2,
.iotype = UPIO_MEM32,
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_SKIP_TEST,
},
{
.membase = (void *) io_p2v(UART3_BASE),
.mapbase = UART3_BASE,
.irq = IRQ_UART_IIR3,
.uartclk = MAIN_OSC_FREQ,
.regshift = 2,
.iotype = UPIO_MEM32,
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_SKIP_TEST,
},
{
.membase = (void *) io_p2v(UART4_BASE),
.mapbase = UART4_BASE,
.irq = IRQ_UART_IIR4,
.uartclk = MAIN_OSC_FREQ,
.regshift = 2,
.iotype = UPIO_MEM32,
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_SKIP_TEST,
}
}
struct platform_device serial_std_platform_device = {
.name = "serial8250",
.id = 0,
.dev = {
.platform_data = serial_std_platform_data,
},
};
這個(gè)platform_device對(duì)象的私有數(shù)據(jù)指成員向一個(gè)plat_serial8250_port類型的數(shù)組。在這里該數(shù)組描述了三個(gè)串口接口的基本信息。當(dāng)8250驅(qū)動(dòng)檢測(cè)到這個(gè)platform_device對(duì)象后,就分析該對(duì)象的私有數(shù)據(jù)成員指向的那個(gè)plat_serial8250_port類型的數(shù)組。然后根據(jù)該數(shù)組的每個(gè)成員描述的信息生成一個(gè)串口對(duì)象設(shè)備。

實(shí)現(xiàn)了這個(gè)platform_device結(jié)構(gòu)體后,把這個(gè)對(duì)象注冊(cè)即可。但這個(gè)對(duì)象的name必須是serial8250。否則8250驅(qū)動(dòng)檢測(cè)不到這個(gè)樣的設(shè)備。

如果注冊(cè)順利且工作正常,那么在驅(qū)動(dòng)加載時(shí)會(huì)打印出串口接口探測(cè)信息:
serial8250.0: ttyS0 at MMIO 0x40080000 (irq = 7) is a 16550A
serial8250.0: ttyS1 at MMIO 0x40088000 (irq = 8) is a 16550A
serial8250.0: ttyS2 at MMIO 0x40098000 (irq = 10) is a 16550A

serial8250.0表示8250驅(qū)動(dòng)檢測(cè)到的第一個(gè)platform_device對(duì)象。如果檢測(cè)到第二個(gè)platform對(duì)象,會(huì)打印成serial8250.1;如此類推。

0x40080000表示串口接口寄存器物理地址的基地址;
irq描述串口接口所用的中斷;
16550A表示該串口接口的類型。有可能這個(gè)類型的名字不是我們所預(yù)期的,但是只要該類型的TX/RX FIFO長度和我們實(shí)際串口接口的一樣,就可以接受。

ttyS0/1/2表示串口設(shè)備的名字
如果注冊(cè)成功,則在/dev/目錄下生成: ttyS0,ttyS1,ttyS2的設(shè)備文件節(jié)點(diǎn)。同時(shí)在/sys/devices/platform/目錄下,生成serial8250,serial8250.0目錄。

這時(shí)即可對(duì)串口的各設(shè)備文件節(jié)點(diǎn)進(jìn)行測(cè)試。
下面詳細(xì)介紹plat_serial8250_port這個(gè)對(duì)象。我們看一段上面的代碼:
{
.membase = (void *) io_p2v(UART5_BASE),
.mapbase = UART5_BASE,
.irq = IRQ_UART_IIR5,
.uartclk = MAIN_OSC_FREQ,
.regshift = 2,
.iotype = UPIO_MEM32,
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_SKIP_TEST,
},
membase:
該成員描述的該串口接口寄存器虛擬地址的基地址。在初始化該成員時(shí),需要自己把該串口接口寄存器的物理地址映射到虛擬地址空間。并且該映射工作需要在內(nèi)核的板級(jí)初始化階段完成。

mapbase:

該成員描述的該串口接口寄存器物理地址的基地址。其實(shí)只要初始化了mapbase成員,上面的membase成員就可以不必初始化了。因?yàn)?250驅(qū)動(dòng)如果檢測(cè)到只初始化了mapbase成員而membase為NULL,則自動(dòng)把該串口接口寄存器的物理地址空間映射到虛擬地址空間。

irq:
該成員描述的是該串口接口使用的中斷號(hào)。

uartclk:
該成員描述了該串口接口使用的時(shí)鐘頻率。

regshift:
該成員表示:在訪問該串口接口的某個(gè)寄存器時(shí),需把該寄存器的號(hào)左移多少位然后加基地址(不管是物理或虛擬地址)才能得能到這個(gè)寄存器的址址。

iotype:
該成員表示該串口接口寄存器的地址類型,可以取值以下的其中一個(gè):
UPIO_PORT 端口地址,8位
UPIO_HUB6
UPIO_MEM 8位的內(nèi)存地址
UPIO_MEM32 32位的內(nèi)存地址
UPIO_AU
UPIO_TSI
UPIO_DWAPB
UPIO_RM9000

一般來說,如果該成員初始化為UPIO_MEM或UPIO_PORT,那么regshift成員應(yīng)該為0;如果該成員初始化為UPIO_MEM32,那么regshift成員應(yīng)該為2.

flags:
UPF_BOOT_AUTOCONF 表示自動(dòng)探測(cè)串口類型,這個(gè)一般是需要的
UPF_SKIP_TEST 表示在探測(cè)串口類型時(shí),是否測(cè)試地址的可訪問性。這在調(diào)試階段是需要的。

除了flags,上面的各個(gè)成員都必須嚴(yán)格設(shè)置正確才能保證串口接口被正確探測(cè)和初始化。
如果串口接口類型沒有被探測(cè)出來,或者FIFO長度不對(duì),這需要考慮寄存器的訪問是否正確,這包括:基地址是否正確,regshift和iotype是否正確,時(shí)鐘頻率是否正確。

如果探測(cè)信息也沒有,或者接口數(shù)量不對(duì)。那么請(qǐng)?jiān)趍em menuconfig中,在
Device Drivers --->
Character devices --->
Serial drivers --->
(8) Maximum number of 8250/16550 serial ports
(8) Number of 8250/16550 serial ports to register at runtime
這兩項(xiàng)的數(shù)字等于在8250注冊(cè)串口接口的總數(shù)。

以下課程可免費(fèi)試聽C語言電子PCBSTM32LinuxFPGA、JAVA、安卓等。
想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽課了。
宋工企鵝號(hào):35--24-65--90-88   Tel/WX:173--17--95--19--08



本文地址:http://m.4huy16.com/thread-547284-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • “芯”光璀璨,鵬城共賞——2025 Microchip中國技術(shù)精英年會(huì)深圳站回顧
  • 電動(dòng)兩輪車設(shè)計(jì)生態(tài)系統(tǒng)
  • Microchip第22屆中國技術(shù)精英年會(huì)上海首站開幕
  • 技術(shù)熱潮席卷三城,2025 Microchip中國技術(shù)精英年會(huì)圓滿收官!
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表