日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

6410 实现 linux 串口驱动详解

發布時間:2024/9/3 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6410 实现 linux 串口驱动详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了實現串口通信,需要在嵌入式linux下編寫相應的驅動程序。在嵌入式系統中,串口被看做終端設備tty。終端設備是unix體系中一個非常重要的對象,內容非常復雜,它是整個unix人機交互的基礎,其地位并不亞于文件系統在操作系統中的作用。筆者muge0913在此對uart驅動進行整理。


本文章僅供技術交流請勿商用。轉載請標明出處:http://blog.csdn.net/muge0913/article/details/7060254


一、串口概述

???? 串口分為:同步傳輸(usrt)和異步傳輸(uart),其中異步傳輸是嵌入系統中最長用的通信設備,串口常被當做控制臺使用。

①同步傳輸:發送端和接收端使用同一個時鐘。其時序如下:



②異步傳輸:在數據傳輸過程中,接收時鐘和發送時鐘是不同步的,即在串行總線上并沒有時鐘線。

傳輸前有相應的起始位,然后緊接著發送數據位(5~8位有用戶定義),最后是奇偶校驗位和停止位。如圖:



二、串口物理層連接問題

?? 因為串口電纜有交叉和直連接之分,其接口有公頭和母頭之分,所以其連接有6中連接方式:

?? ①兩頭公頭的直線電纜

?? ②兩頭母頭的交叉線

?? ③兩頭公頭的交叉線

?? ④兩個母頭的直線電纜

?? ⑤一公頭一母頭的直線電纜

?? ⑥一公頭一母頭的交叉線

?? 在大多數的異步通信中不需要流的控制,所以3根線就能滿座嵌入式設備通信的要求,但是為了保持兼容常常使用下面的連接方法:

三、arm11中的uart

①概述:

??? S3C6410X的UART提供四個獨立的異步串行I / O(SIO)端口。異步串行I / O(SIO)端口,每個都可以在基于中斷或基于DMA模式。換句話說,UART可以產生中斷或DMA請求MEM和UART之間的數據傳輸。UART也可支持最大3Mbps的比特率。每個UART通道包含兩個64字節的FIFO的接收和傳輸的。

②特點


四、寄存器配置略請開發者閱讀芯片資料和參考下列代碼中的注釋

五、驅動源碼:

[cpp]?view plaincopyprint?
  • #include?<linux/module.h>??
  • #include?<linux/ioport.h>??
  • #include?<linux/io.h>??
  • #include?<linux/platform_device.h>??
  • #include?<linux/init.h>??
  • #include?<linux/serial_core.h>??
  • #include?<linux/serial.h>??
  • ??
  • #include?<asm/irq.h>??
  • #include?<mach/hardware.h>??
  • ??
  • #include?<plat/regs-serial.h>??
  • ??
  • #include?"samsung.h"??
  • ??
  • static?int?s3c6400_serial_setsource(struct?uart_port?*port,??
  • ????????????????????struct?s3c24xx_uart_clksrc?*clk)??
  • {??
  • ????unsigned?long?ucon?=?rd_regl(port,?S3C2410_UCON);??
  • ??
  • ????if?(strcmp(clk->name,?"uclk0")?==?0)?{??
  • ????????ucon?&=?~S3C6400_UCON_CLKMASK;??
  • ????????ucon?|=?S3C6400_UCON_UCLK0;??
  • ????}?else?if?(strcmp(clk->name,?"uclk1")?==?0)??
  • ????????ucon?|=?S3C6400_UCON_UCLK1;??
  • ????else?if?(strcmp(clk->name,?"pclk")?==?0)?{??
  • ????????/*?See?notes?about?transitioning?from?UCLK?to?PCLK?*/??
  • ????????ucon?&=?~S3C6400_UCON_UCLK0;??
  • ????}?else?{??
  • ????????printk(KERN_ERR?"unknown?clock?source?%s\n",?clk->name);??
  • ????????return?-EINVAL;??
  • ????}??
  • ??
  • ????wr_regl(port,?S3C2410_UCON,?ucon);??
  • ????return?0;??
  • }??
  • ??
  • ??
  • static?int?s3c6400_serial_getsource(struct?uart_port?*port,??
  • ????????????????????struct?s3c24xx_uart_clksrc?*clk)??
  • {??
  • ????u32?ucon?=?rd_regl(port,?S3C2410_UCON);??
  • ??
  • ????clk->divisor?=?1;??
  • ??
  • ????switch?(ucon?&?S3C6400_UCON_CLKMASK)?{??
  • ????case?S3C6400_UCON_UCLK0:??
  • ????????clk->name?=?"uclk0";??
  • ????????break;??
  • ??
  • ????case?S3C6400_UCON_UCLK1:??
  • ????????clk->name?=?"uclk1";??
  • ????????break;??
  • ??
  • ????case?S3C6400_UCON_PCLK:??
  • ????case?S3C6400_UCON_PCLK2:??
  • ????????clk->name?=?"pclk";??
  • ????????break;??
  • ????}??
  • ??
  • ????return?0;??
  • }??
  • ??
  • static?int?s3c6400_serial_resetport(struct?uart_port?*port,??
  • ????????????????????struct?s3c2410_uartcfg?*cfg)??
  • {??
  • ????unsigned?long?ucon?=?rd_regl(port,?S3C2410_UCON);??
  • ??
  • ????dbg("s3c6400_serial_resetport:?port=%p?(%08lx),?cfg=%p\n",??
  • ????????port,?port->mapbase,?cfg);??
  • ??
  • ????/*?ensure?we?don't?change?the?clock?settings...?*/??
  • ??
  • ????ucon?&=?S3C6400_UCON_CLKMASK;??
  • ??
  • ????wr_regl(port,?S3C2410_UCON,??ucon?|?cfg->ucon);??
  • ????wr_regl(port,?S3C2410_ULCON,?cfg->ulcon);??
  • ??
  • ????/*?reset?both?fifos?*/??
  • ??
  • ????wr_regl(port,?S3C2410_UFCON,?cfg->ufcon?|?S3C2410_UFCON_RESETBOTH);??
  • ????wr_regl(port,?S3C2410_UFCON,?cfg->ufcon);??
  • ??
  • ????return?0;??
  • }??
  • ??
  • static?struct?s3c24xx_uart_info?s3c6400_uart_inf?=?{??
  • ????.name???????=?"Samsung?S3C6400?UART",??
  • ????.type???????=?PORT_S3C6400,??
  • ????.fifosize???=?64,??
  • ????.has_divslot????=?1,??
  • ????.rx_fifomask????=?S3C2440_UFSTAT_RXMASK,??
  • ????.rx_fifoshift???=?S3C2440_UFSTAT_RXSHIFT,??
  • ????.rx_fifofull????=?S3C2440_UFSTAT_RXFULL,??
  • ????.tx_fifofull????=?S3C2440_UFSTAT_TXFULL,??
  • ????.tx_fifomask????=?S3C2440_UFSTAT_TXMASK,??
  • ????.tx_fifoshift???=?S3C2440_UFSTAT_TXSHIFT,??
  • ????.get_clksrc?=?s3c6400_serial_getsource,??
  • ????.set_clksrc?=?s3c6400_serial_setsource,??
  • ????.reset_port?=?s3c6400_serial_resetport,??
  • };??
  • ??
  • /*?device?management?*/??
  • ??
  • static?int?s3c6400_serial_probe(struct?platform_device?*dev)??
  • {??
  • ????dbg("s3c6400_serial_probe:?dev=%p\n",?dev);??
  • ????return?s3c24xx_serial_probe(dev,?&s3c6400_uart_inf);??
  • }??
  • ??
  • static?struct?platform_driver?s3c6400_serial_driver?=?{??
  • ????.probe??????=?s3c6400_serial_probe,??
  • ????.remove?????=?__devexit_p(s3c24xx_serial_remove),??
  • ????.driver?????=?{??
  • ????????.name???=?"s3c6400-uart",??
  • ????????.owner??=?THIS_MODULE,??
  • ????},??
  • };??
  • ??
  • s3c24xx_console_init(&s3c6400_serial_driver,?&s3c6400_uart_inf);??
  • ??
  • static?int?__init?s3c6400_serial_init(void)??
  • {??
  • ????return?s3c24xx_serial_init(&s3c6400_serial_driver,?&s3c6400_uart_inf);??
  • }??
  • ??
  • static?void?__exit?s3c6400_serial_exit(void)??
  • {??
  • ????platform_driver_unregister(&s3c6400_serial_driver);??
  • }??
  • ??
  • module_init(s3c6400_serial_init);??
  • module_exit(s3c6400_serial_exit);??
  • ??
  • MODULE_AUTHOR("muge0913");??
  • MODULE_LICENSE("GPL?v2");??
  • MODULE_ALIAS("platform:s3c6400-uart"); ?
  • 總結

    以上是生活随笔為你收集整理的6410 实现 linux 串口驱动详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。