成人sese/国产免费人成视频在线观看/九色 在线/免费观看又色又爽又黄的/啪在线视频/日日做日日摸夜夜爽

首頁(yè) 新聞 > 科技 > 正文

Linux下的串口總線驅(qū)動(dòng)(一)

一.系統(tǒng)理論

PC機(jī)南橋的LPC總線(Low Pin Count并行總線,代替以前的ISA總線)上掛接了一個(gè)超級(jí)I/O模塊,而UART是這個(gè)超級(jí)模塊芯片組的一部分,這個(gè)UART通過(guò)RS232線程轉(zhuǎn)換與串行端口相連。與RS232不同,RS485并不是標(biāo)準(zhǔn)的PC接口,但在嵌入式領(lǐng)域,會(huì)為了可靠通信而使用RS485,RS485使用差分信號(hào),因此其傳輸距離可以達(dá)到數(shù)百米,而RS232傳輸距離僅數(shù)幾米,在處理器一端,RS485接口是半雙工的UART操作。

本文引用地址:http://www.eepw.com.cn/article/201611/319918.htm

Linux包含如下幾種終端設(shè)備:串行端口終端(/dev/ttySn)、偽終端(/dev/pty)、控制終端(/dev/tty)、控制臺(tái)終端(/dev/ttyn,/dev/conslole)。串行端口終端使用的設(shè)備名為/dev/ttyS0,/dev/ttyS1等,對(duì)應(yīng)的設(shè)備號(hào)為(4,0),(4,1)。通過(guò)查看/proc/tty/drivers文件可以知道什么類(lèi)型的tty設(shè)備存在以及什么驅(qū)動(dòng)被加載到內(nèi)核,這個(gè)文件包括一個(gè)當(dāng)前存在的不同tty驅(qū)動(dòng)的列表,包括驅(qū)動(dòng)名,缺省的節(jié)點(diǎn)名,驅(qū)動(dòng)的主編號(hào),驅(qū)動(dòng)的次編號(hào)范圍,以及tty驅(qū)動(dòng)的類(lèi)型。

I/O系統(tǒng)調(diào)用是從帶有線路規(guī)程的TTY I/O核心開(kāi)始,然后通過(guò)TTY層,最后到達(dá)UART驅(qū)動(dòng)層。主要涉及串口內(nèi)核配置、UART層內(nèi)核代碼、TTY層內(nèi)核代碼、線路規(guī)程內(nèi)核代碼、串口測(cè)試代碼五個(gè)部分。

二.串口內(nèi)核配置

對(duì)于Mini2440串口驅(qū)動(dòng),我想從配置開(kāi)始講起。在內(nèi)核中Kconfig必須完成一層層調(diào)用,如果沒(méi)有在上一個(gè)Kconfig中調(diào)用該層Kconfig,那么該層Kconfig中的內(nèi)容不會(huì)在此出現(xiàn)。這種情況下,只有當(dāng)該層的Kconfig被其他層調(diào)用,該層Kconfig中的內(nèi)容才會(huì)被顯示。所以我們找找drivers/serial/Kconfig在哪里被調(diào)用的呢?

在/drivers/char/kconfig中可以看到一行代碼source "drivers/serial/Kconfig",那我們就到drivers/serial/Kconfig下看看

Samsung SoC serial support對(duì)應(yīng)于samsung.oserial_core.o

config SERIAL_SAMSUNG

tristate "Samsung SoC serial support"

depends on ARM && PLAT_S3C

select SERIAL_CORE

Support for console on Samsung SoC serial port對(duì)應(yīng)于控制臺(tái)驅(qū)動(dòng)

Samsung S3C2440/S3C2442 Serial port support對(duì)應(yīng)于s3c2440.o

在/drivers/char/Makefile中可以看到

obj-y+= mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o

我們知道tty_io.on_tty.o tty_ioctl.otty_ldisc.o tty_buffer.o tty_port.o已編入內(nèi)核

自此,我們知道關(guān)于串口驅(qū)動(dòng),我們內(nèi)核中被編譯了s3c2440.osamsung.oserial_core.o tty_io.on_tty.o tty_ioctl.otty_ldisc.o tty_buffer.o tty_port.o

我們對(duì)此進(jìn)行分類(lèi),屬于UART層的是s3c2440.osamsung.o;屬于TTY層的是serial_core.o;屬于線路規(guī)程的是tty_io.on_tty.o tty_ioctl.otty_ldisc.o tty_buffer.o tty_port.o 。

好了,對(duì)于串口的地圖我們已經(jīng)分析好了,那我們就按照UART層,TTY層,線路規(guī)程一個(gè)個(gè)的逛逛吧。

三.UART層內(nèi)核代碼

我們先看看samsung.o的init代碼吧,這里面完成了uart_driver的注冊(cè)

static int __init s3c24xx_serial_modinit(void)

{

int ret;

ret = uart_register_driver(&s3c24xx_uart_drv);//注冊(cè)u(píng)art_driver

if (ret < 0) {

printk(KERN_ERR "failedto register UART driver\n");

return -1;

}

return 0;

}

static struct uart_driver s3c24xx_uart_drv = {

.owner= THIS_MODULE,

.dev_name= "s3c2410_serial", //設(shè)備名

.nr= CONFIG_SERIAL_SAMSUNG_UARTS,//UART端口個(gè)數(shù)

.cons= S3C24XX_SERIAL_CONSOLE,//指向控制臺(tái)結(jié)構(gòu)

.driver_name= S3C24XX_SERIAL_NAME,//驅(qū)動(dòng)的名字

.major= S3C24XX_SERIAL_MAJOR,//串口主設(shè)備號(hào)

.minor= S3C24XX_SERIAL_MINOR,//串口次設(shè)備號(hào)

};

我們關(guān)注下上面這個(gè)結(jié)構(gòu)體中一個(gè)成員S3C24XX_SERIAL_CONSOLE

#define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console

static struct console s3c24xx_serial_console = {

.name= S3C24XX_SERIAL_NAME,

.device= uart_console_device,

.flags= CON_PRINTBUFFER,

.index= -1,

.write= s3c24xx_serial_console_write,

.setup= s3c24xx_serial_console_setup

};

上面是控制臺(tái)的結(jié)構(gòu)體成員。

對(duì)于UART驅(qū)動(dòng),我們除了需要注冊(cè)u(píng)art_driver外,還需要注冊(cè)端口,我們看看s3c2440.o。

這個(gè)文件里面注冊(cè)了一個(gè)平臺(tái)設(shè)備,其中平臺(tái)設(shè)備的探測(cè)函數(shù)最終調(diào)用了samsung.o中的s3c24xx_serial_probe函數(shù)。

int s3c24xx_serial_probe(struct platform_device *dev,

struct s3c24xx_uart_info *info)

{

struct s3c24xx_uart_port *ourport;

int ret;

dbg("s3c24xx_serial_probe(%p, %p) %d\n", dev, info, probe_index);

ourport = &s3c24xx_serial_ports[probe_index]; //選擇s3c24xx_uart_port

probe_index++; //索引號(hào)自增

dbg("%s: initialising port %p...\n", __func__, ourport);

ret = s3c24xx_serial_init_port(ourport, info, dev);//初始化串口

if (ret < 0)

goto probe_err;

dbg("%s: adding port\n", __func__);

uart_add_one_port(&s3c24xx_uart_drv, &ourport->port); //向內(nèi)核注冊(cè)端口

platform_set_drvdata(dev, &ourport->port); //設(shè)置私有數(shù)據(jù)

ret = device_create_file(&dev->dev, &dev_attr_clock_source); //添加設(shè)備屬性

if (ret < 0)

printk(KERN_ERR "%s: failed to add clksrc attr.\n", __func__);

ret = s3c24xx_serial_cpufreq_register(ourport);//注冊(cè)CPU頻率

if (ret < 0)

dev_err(&dev->dev, "failed to add cpufreq notifier\n");

return 0;

probe_err:

return ret;

}

通過(guò)上面的函數(shù),我們發(fā)現(xiàn)在UART層,我們調(diào)用了uart_add_one_port函數(shù)完成端口的添加,我們來(lái)看看添加了什么端口呢?

static struct s3c24xx_uart_port s3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] = {

[0] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX0,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//對(duì)UART操作的函數(shù)

.flags= UPF_BOOT_AUTOCONF,

.line= 0,

}

},

[1] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX1,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//對(duì)UART操作的函數(shù)

.flags= UPF_BOOT_AUTOCONF,

.line= 1,

}

},

#if CONFIG_SERIAL_SAMSUNG_UARTS >2

[2] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX2,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//對(duì)UART操作的函數(shù)

.flags= UPF_BOOT_AUTOCONF,

.line= 2,

}

},

#endif

#if CONFIG_SERIAL_SAMSUNG_UARTS >3

[3] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[3].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX3,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//對(duì)UART操作的函數(shù)

.flags= UPF_BOOT_AUTOCONF,

.line= 3,

}

}

#endif

};

在端口的定義中,我們知道s3c24xx_uart_port中定義了一個(gè)uart_port結(jié)構(gòu)體,繼續(xù)跟蹤對(duì)UART的操作函數(shù)

static struct uart_ops s3c24xx_serial_ops = {

.pm= s3c24xx_serial_pm,

.tx_empty= s3c24xx_serial_tx_empty,//發(fā)送是否忙

.get_mctrl= s3c24xx_serial_get_mctrl,

.set_mctrl= s3c24xx_serial_set_mctrl,

.stop_tx= s3c24xx_serial_stop_tx,

.start_tx= s3c24xx_serial_start_tx,//類(lèi)似于write

.stop_rx= s3c24xx_serial_stop_rx,

.enable_ms= s3c24xx_serial_enable_ms,

.break_ctl= s3c24xx_serial_break_ctl,

.startup= s3c24xx_serial_startup,//類(lèi)似于open

.shutdown= s3c24xx_serial_shutdown,//類(lèi)似于close

.set_termios= s3c24xx_serial_set_termios,//設(shè)置線路規(guī)程

.type= s3c24xx_serial_type,

.release_port= s3c24xx_serial_release_port,//釋放端口資源

.request_port= s3c24xx_serial_request_port,//申請(qǐng)端口資源

.config_port= s3c24xx_serial_config_port,//配置端口

.verify_port= s3c24xx_serial_verify_port,

};

對(duì)于上述uart_ops函數(shù),我們需要自己去實(shí)現(xiàn)uart層的具體操作。

我們?cè)赨ART層主要涉及uart_driver,uart_port,uart_ops三個(gè)結(jié)構(gòu)體,并調(diào)用tty層的uart_register_driver和uart_add_one_port完成驅(qū)動(dòng)和端口的注冊(cè),UART層具體操作函數(shù)需要用戶(hù)自己設(shè)計(jì)。

好了,總結(jié)下UART驅(qū)動(dòng)層需要完成的任務(wù):

其一,定義uart_driver、uart_ops、uart_port等結(jié)構(gòu)體的實(shí)例并在適當(dāng)?shù)牡胤礁鶕?jù)具體硬件和驅(qū)動(dòng)的情況初始化它們,當(dāng)然具體設(shè)備XXX的驅(qū)動(dòng)可以將這些結(jié)構(gòu)套在新定義的XXX_uart_driver、XXX_uart_ops、XXX_uart_port之內(nèi)。

其二,在模塊初始化時(shí)調(diào)用uart_register_driver()和uart_add_one_port()以注冊(cè)UART驅(qū)動(dòng)并添加端口,在模塊卸載時(shí)調(diào)用uart_unregister_driver()和uart_remove_one_port()以注銷(xiāo)UART驅(qū)動(dòng)并移除端口。

其三,根據(jù)具體硬件的datasheet實(shí)現(xiàn)uart_ops中的成員函數(shù),這些函數(shù)的實(shí)現(xiàn)成為UART驅(qū)動(dòng)的主體工作。

關(guān)鍵詞: Linux串口總線驅(qū)

最近更新

關(guān)于本站 管理團(tuán)隊(duì) 版權(quán)申明 網(wǎng)站地圖 聯(lián)系合作 招聘信息

Copyright © 2005-2018 創(chuàng)投網(wǎng) - m.zhigu.net.cn All rights reserved
聯(lián)系我們:33 92 950@qq.com
豫ICP備2020035879號(hào)-12

 

主站蜘蛛池模板: 国产无限次数成版人视频在线 | 一区二区激情 | 精品视频免费 | 精品免费观看 | 久久久99久久久国产自输拍 | 婷婷久草 | 伊人久久久久久久久久久久 | 天天av天天好逼 | 人妻无码一区二区三区 | 亚洲国产日韩在线人成蜜芽 | 国产精品乡下勾搭老头1 | 国产毛茸茸毛毛多水水多 | 免费国产a国产片高清网站 国产精品国产高清国产av | 丰满少妇aaaaaa爰片毛片 | 四虎影视在线播免费观看 | 国产一区二区美女 | 国产成人av乱码免费观看 | 伊人久久大香线蕉av波多野结衣 | 免费a级毛片18以上观看精品 | 日韩精品国产一区二区三区久久 | 亚洲综合另类小说专区 | 欧美成人国产精品高潮 | 国产精品视频一二三 | 99久久99这里只有免费费精品 | 波多野在线视频 | 天天做天天摸天天爽欧美一区 | 色av性av丰满av| 亚洲欧洲日产国产av无码 | 女人18毛片九区毛片在线 | 国产精品入口免费软件 | 亚洲色大成网站www永久网站 | 91视频首页 | 亚洲国产av精品一区二区蜜芽 | 国产精品又黄又爽又色 | 国产在线极品 | 性欧美激情aa在线看 | 久久性色欲av免费精品观看 | 夜夜躁狠狠躁日日躁视频 | 少妇裸体淫交视频免费观看 | caob视频| 国产成人精品久久二区二区91 | 精品一区二区三区在线播放视频 | 99热最新 | 青青草原综合久久大伊人 | 国产亚洲天堂 | 青草青草久热精品视频国产4 | 97在线超碰 | 精品熟人一区二区三区四区 | 国产高清美女一级a毛片久久 | 在线爽 | 久久免费视频一区二区 | 国产精品国产精品国产专区不片 | 国产 制服丝袜 动漫在线 | 日韩一区二区三区免费视频 | 欧美有码在线 | www.日韩一区 | 亚洲黄v| 久久4| 孩交精品xxxx视频视频 | 主站蜘蛛池模板: 蛛词}| 91亚洲网站| 日韩精品视频在线观看一区二区 | 在线欧美 | 人妻少妇-嫩草影院 | 黑人与中国少妇xxxx视频在线 | 亚洲图片另类图片激情动图 | 日韩精品免费一区二区三区四区 | 初尝黑人巨砲波多野结衣 | 国产第一毛片 | 夜夜国产亚洲视频香蕉 | 国产拍拍拍无码视频免费 | 国产美女狂喷水潮在线播放 | 亚洲成人天堂 | 中文字幕啪啪 | 噜噜色小说 | 国产精品久久久国产盗摄 | 91少妇丨porny丨 | 91精品国产综合久久久久久 | 丰满少妇熟女高潮流白浆 | 国产精品网站在线观看免费传媒 | 国产一区二区三区久久久 | 91精品久久久久含羞草 | ai换脸赵丽颖国产一区裸 | 丰满少妇在线观看 | 午夜自产精品一区二区三区 | 狠狠躁日日躁夜夜躁2022麻豆 | 成人做爰www免费看视频网站 | 久久国产精品偷 | 国产又粗又大又爽的视频 | 天天干天天草 | 第一福利精品500在线导航 | 成人免费大片黄在线观看com | 久久精品第一国产久精国产宅男66 | 久久人人做人人妻人人玩精品va | 欧美大荫蒂xxx | 2020久久超碰国产精品最新 | 亚洲区精品| 久激情内射婷内射蜜桃 | 成人影片在线播放 | 久草网站在线观看 | porny九色| 久久久精品一区aaa片 | 久操新在线 | 一本之道久 | 日韩视频在线观看免费视频 | 国产日韩一区二区三免费高清 | 国产精品久久久久久久av | 成人国产精品入口免费视频 | 少妇人妻精品一区二区 | 免费在线小视频 | 亚洲国产成人片在线观看 | 亚洲综合av色婷婷 | 高清欧美精品xxxxx在线看 | 亚洲高清国产拍精品动图 | 欧美人与动性xxxxx交性 | 国产精品色无码av在线观看 | 午夜一区欧美二区高清三区 | 成人性做爰片免费视频 | 久草视频播放 | 主站蜘蛛池模板: 蛛词}| 婷婷丁香五月激情综合在线 | 亚洲欧美在线视频 | 亚洲国产精品人人做人人爱 | 国产艳情熟女视频 | 91久久人人 | 97超碰在线免费 | 日日夜夜免费精品 | 亚洲精品一区二区不卡 | 在线日本国产成人免费不卡 | 在线亚洲色图 | 伊人久久久av老熟妇色 | 91久久久爱一区二区三区 | 88av在线播放 | 亚洲精品99久久久久中文字幕 | 天堂无码人妻精品一区二区三区 | 国产精品国产三级国产密月 | 蜜桃av色偷偷av老熟女 | 日本www.小久久 | 伊人网综合在线 | 少妇翘臀亚洲精品av图片 | 国产在线视频精品视频 | 精品久久久久久中文字幕无码vr | 啦啦啦中文在线视频免费观看 | 伊人久久大香线蕉综合中文字幕 | 屁屁国产草草影院ccyycom | 一级黄色日本 | 丰满少妇精品久久久久久 | 免费国产a国产片高清网站 国产精品国产高清国产av | 亚洲免费视频免在线观看 | 亚洲另类专区av | 成年人激情网 | 国产精品99精品无码视亚 | 国产99视频精品免费视看9 | 亚洲欧洲一区二区三区 | 青青青在线视频免费观看 | 91av视频在线播放 | 亚洲精品久久久久久一区 | 国内精品久久久久久不卡影院 | 国产在线看片无码人精品 | 天天干视频在线观看 | 免费无码一区无码东京热 | 18禁男女污污污午夜网站免费暖暖 | 日本精品久久久久中文字幕乱中年 | 制服丝袜成人动漫 | av无码一区二区大桥久未 | 久久精品五月天 | 香蕉久久人人爽人人爽人人片av | 国产亚洲精品一区在线播放 | 亚洲色在线无码国产精品 | 日本中文字幕在线免费观看 | 老熟女毛茸茸浓毛 | 麻豆疯狂做受xxxx高潮视频 | 午夜视频18| 无码aⅴ精品一区二区三区 国产视频二区三区 | 国产精品夜间视频香蕉 | 国产一级免费视频 | 欧美国产乱视频 | 日韩视频在线观看网站 | 男女啪啪免费观看的网址 | 主站蜘蛛池模板: 蛛词}| 日本一区二区视频在线播放 | 欧美肥妇毛多水多bbxx水蜜桃 | 国产精品videossex久久发布 | 欧美一级欧美三级在线观看 | 天天爱综合 | 日本不卡一区二区三区视频 | 波多野结衣av在线无码中文18 | 久久视频这里有久久精品视频11 | 国产精品 高清 尿 小便 嘘嘘 | 三上悠亚国产精品一区内容阅读 | 日日夜夜操操操 | 高级会所人妻互换94部分 | 亚洲色av性色在线观无码 | 中文字幕免费高清视频 | 国产口爆吞精在线视频2020版 | 美女网站免费在线观看 | 久草精品视频在线看网站免费 | 香蕉97超级碰碰碰免费公开 | 一个色综合国产色综合 | 又爽又黄又无遮挡网站 | 欧美系列在线观看 | 久久久久国产精品人妻aⅴ牛牛 | 久久国产精品99久久久久久老狼 | 狠狠操狠狠 | 女人天堂在线a在线 | 日本japanese极品少妇 | 亚欧在线免费观看 | 亚洲欧美日韩精品久久奇米一区 | 亚洲爱色 | 亚洲欧美日韩人成在线播放 | 成人国产mv免费视频 | 久久精品aⅴ无码中文字字幕蜜桃 | 中文字幕人成人乱码亚洲电影 | 好吊妞人成视频在线观看强行 | 国产v精品成人免费视频 | 亚洲国产成人久久久网站 | 91av视频在线 | 日本又黄又爽又无遮挡的视频 | 亚洲精品国产精品99久久 | 91亚洲一区 | 久久久高清 | 日本少妇网站 | 黑人性爽 | 欧美成人免费一级人片100 | 久久草莓香蕉频线观 | 51国产偷自视频区视频 | 免费高清毛片无遮挡 | 在线看欧美| 巨大乳女人做爰视频在线看 | 天堂免费在线视频 | 四虎影视永久免费观看在线 | 亚洲同性同志一二三专区 | 男女高潮激烈免费观看 | 精品久久久久久国产牛牛 | 亚洲精品免费视频 | 国产v亚洲v天堂无码久久久 | 欧美另类高清zo欧美 | 成人亚洲欧美一区二区三区 | 国产av亚洲精品久久久久久小说 | 主站蜘蛛池模板: 蛛词}| 中国少妇xxxx做受18 | 在线视频第一页 | 99热免费看 | 免费无码av一区二区三区 | 午夜福利无遮挡十八禁视频 | 亚洲 校园 春色.自拍 | 亚洲另类欧美综合久久图片区 | 日本乱子伦一区二区三区 | 国产区女主播在线观看 | av观看网址 | 日本强伦姧熟睡人妻完整视频 | 国产56页| 性开放视频 | 免费特黄夫妻生活片 | 韩国美女换衣服 | 精品国产鲁一鲁一区二区张丽 | 国产山村乱淫老妇av色播 | 国产白嫩漂亮ktv在线 | 性视频播放免费视频 | 国产视频网 | 国产成人 综合 亚洲欧洲 | 香蕉久久久 | 欧美一级片在线免费观看 | 日韩欧美高清在线观看 | 成人品视频观看在线 | 日本黄色中文字幕 | 精品福利在线观看 | 在线观看国产精品乱码app | 久青草影院| 无码日本精品xxxxxxxxx | 亚洲国产精品国自产拍av | 色噜噜国产精品视频一区二区 | 久久九九网 | 国产精品久久久久无码av1 | 日本亚欧热亚洲乱色视频 | 亚洲精品国产精品无码国模 | 欧美日韩无线码在线观看 | 久久精品国产露脸对白 | 人妻av综合天堂一区 | 国产精品日本亚洲欧美 | av一级网站 | 99精品人妻国产毛片 | 国产黄又黄 | 人妻乳哺乳无码一区二区 | 日日夜精品欧洲日日噜噜 | 高清国产一区二区三区四区五区 | 亚洲一区在线观看免费 | 97精品视频在线观看 | 国产日产精品久久久久快鸭 | 国内毛片毛片毛片毛片毛片毛片 | 无遮挡啪啪摇乳动态图 | 国产东北农村女人av | 日韩av无码中文字幕 | 成人国内精品久久久久影院vr | 亚洲国产视频一区二区三区 | 国产色视频网站免费 | 日韩在线视频看看 | 伦理片免费完整片在线观看 | 国产寡妇色xxⅹ交肉视频 |