友善開(kāi)發(fā)板RS改RS內(nèi)核驅(qū)動(dòng)修改_第1頁(yè)
友善開(kāi)發(fā)板RS改RS內(nèi)核驅(qū)動(dòng)修改_第2頁(yè)
友善開(kāi)發(fā)板RS改RS內(nèi)核驅(qū)動(dòng)修改_第3頁(yè)
友善開(kāi)發(fā)板RS改RS內(nèi)核驅(qū)動(dòng)修改_第4頁(yè)
友善開(kāi)發(fā)板RS改RS內(nèi)核驅(qū)動(dòng)修改_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、友善6410開(kāi)發(fā)板RS232改RS485基本知識(shí):ARM一般會(huì)使用電平轉(zhuǎn)換芯片把串口TTL電平轉(zhuǎn)換成相應(yīng)的232或485電平信號(hào)。與232稍有不同的是,一般的485是半雙工的,意思就是說(shuō)同一時(shí)刻要么處于接收狀態(tài)要么處于發(fā)送狀態(tài)。485芯片有許多種,但基本大同小異,一般有2個(gè)引腳給用戶(hù)來(lái)控制收發(fā)狀態(tài)。當(dāng)RE為低電平時(shí),485芯片數(shù)據(jù)輸入有效(低電平接收狀態(tài));當(dāng)DE為高電平時(shí),485芯片數(shù)據(jù)輸出有效(高電平發(fā)送狀態(tài))。在半雙工使用中,通常可以將這兩個(gè)腳直接相連,然后通過(guò)輸出的高低電平就可以讓485芯片在接收和發(fā)送狀態(tài)之間轉(zhuǎn)換了。方案:不管怎樣的方案都需要一個(gè)485芯片,不同的是收發(fā)狀態(tài)的控制,可

2、以由電路本身控制,也可以接到CPU的IO口由驅(qū)動(dòng)來(lái)控制。1.電路本身控制:市面上可以買(mǎi)到的485轉(zhuǎn)換器都使用這種方案,友善的開(kāi)發(fā)板也使用這種方案,簡(jiǎn)單來(lái)講,就是從485芯片的DI腳(接到ARM的TXD)取得收發(fā)狀態(tài),進(jìn)而設(shè)置485芯片的收發(fā)狀態(tài)。因?yàn)橛焉埔呀?jīng)實(shí)現(xiàn)了,所以本文不討論這種方案,友善的支持485的開(kāi)發(fā)板光盤(pán)里有原理圖,這里就不提供了。2.IO口控制:?jiǎn)纹瑱C(jī)很多使用此方案,因?yàn)閷?shí)現(xiàn)起來(lái)簡(jiǎn)單,但是用在ARM上就不簡(jiǎn)單了,本文就介紹此方案。單片機(jī)控制的話(huà),大概是這么個(gè)流程:一開(kāi)始是接收狀態(tài),數(shù)據(jù)發(fā)送前先置高,并稍作延時(shí),等待485芯片初始化為發(fā)送狀態(tài),然后開(kāi)始發(fā)送,發(fā)送完成后稍作延時(shí),等待

3、發(fā)送完成,然后置低進(jìn)入接收狀態(tài)。在ARM中雖然需要修改內(nèi)核驅(qū)動(dòng),而且還要占用額外的IO口,但仍然是一個(gè)可行的方案,經(jīng)測(cè)試各種波特率都使用正常,連續(xù)幾天使用過(guò)程中也挺穩(wěn)定。詳細(xì)請(qǐng)看具體實(shí)現(xiàn)方法。具體實(shí)現(xiàn)方法:485一般會(huì)用在定制的產(chǎn)品上,所以估計(jì)是Tiny6410用比較多吧?210的開(kāi)發(fā)板還沒(méi)有嘗試,但一般2.6內(nèi)核的話(huà)大同小異,如果有在210上改成功的,可以共享一下以供參考。范例所用的開(kāi)發(fā)板使用友善的Tiny6410,當(dāng)然Mini6410也行,并且適用于android和linux的內(nèi)核。示范改2個(gè)串口為485,分別是COM0和COM2,因?yàn)镃OM1是5線(xiàn)串口改了可惜所以跳過(guò)。如果你懂得了如何改

4、2個(gè)串口,那么改成1個(gè)或改成3個(gè)都沒(méi)問(wèn)題了吧。這里舉例用TI的485芯片:sn65lbc184,當(dāng)然其它的485芯片也行。芯片手冊(cè)我用的電路如下圖,COM0使用SPICS/GPC7來(lái)控制,COM2使用SPIMOSI/GPC6來(lái)控制最終實(shí)現(xiàn)的效果:1.和一般的232串口一樣使用,應(yīng)用層無(wú)需改變,占用的2個(gè)GPIO口就不能再做其它用了。2.用戶(hù)LED3,在COM0發(fā)送時(shí)亮(低電平),接收時(shí)滅(高電平),用戶(hù)LED4,在COM2發(fā)送時(shí)亮(低電平),接收時(shí)滅(高電平)。注意:Mini6410的用戶(hù)LED不知道是不是和Tiny6410的定義一樣?Mini6410如果不一樣可以自行更改,LED只是為了更好

5、的看到COM0和COM2的通訊狀態(tài),如果不需要可以把LED控制部分的代碼刪除。以下主要內(nèi)容參考了網(wǎng)上一篇文章的源代碼,想提供原文的鏈接但無(wú)奈搜索引擎上已經(jīng)找不到了,現(xiàn)在搜到的都是一些提問(wèn)貼或無(wú)用的不全的文章-_-。以下針對(duì)友善6410的內(nèi)核版本:,不同版本不保證能夠成功。需要修改內(nèi)核源代碼路徑下的drivers/serial/samsung.c1.因?yàn)橐僮鱃PIO,所以要引用相關(guān)頭文件#include <mach/gpio.h>#include <plat/gpio-cfg.h>2.把static struct uart_ops s3c24xx_serial_ops復(fù)

6、制一份,并修改成如下,有3處需要修改為自定義的函數(shù)。static struct uart_ops s3c24xx_485_ops = .pm= s3c24xx_serial_pm,.tx_empty= s3c24xx_serial_tx_empty,.get_mctrl= s3c24xx_serial_get_mctrl,.set_mctrl= s3c24xx_serial_set_mctrl,.stop_tx= s3c24xx_485_stop_tx,/這個(gè).start_tx= s3c24xx_485_start_tx,/這個(gè).stop_rx= s3c24xx_serial_stop_rx,

7、.enable_ms= s3c24xx_serial_enable_ms,.break_ctl= s3c24xx_serial_break_ctl,.startup= s3c24xx_485_startup,/這個(gè).shutdown= s3c24xx_serial_shutdown,.set_termios= s3c24xx_serial_set_termios,.type= s3c24xx_serial_type,.release_port= s3c24xx_serial_release_port,.request_port= s3c24xx_serial_request_port,.con

8、fig_port= s3c24xx_serial_config_port,.verify_port= s3c24xx_serial_verify_port,;然后更改static struct s3c24xx_uart_port s3c24xx_serial_portsCONFIG_SERIAL_SAMSUNG_UARTS = 0 = /這里是COM0.port = .lock= _SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports0.port.lock),.iotype= UPIO_MEM,.irq= IRQ_S3CUART_RX0,.uartclk= 0,.fi

9、fosize= 16,.ops= &s3c24xx_485_ops,/指向剛才修改的ops.flags= UPF_BOOT_AUTOCONF,.line= 0,1 = /這里是COM1,不修改.port = .lock= _SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports1.port.lock),.iotype= UPIO_MEM,.irq= IRQ_S3CUART_RX1,.uartclk= 0,.fifosize= 16,.ops= &s3c24xx_serial_ops,.flags= UPF_BOOT_AUTOCONF,.line= 1,#

10、if CONFIG_SERIAL_SAMSUNG_UARTS > 22 = /這里是COM2.port = .lock= _SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports2.port.lock),.iotype= UPIO_MEM,.irq= IRQ_S3CUART_RX2,.uartclk= 0,.fifosize= 16,.ops= &s3c24xx_485_ops, /指向剛才修改的ops.flags= UPF_BOOT_AUTOCONF,.line= 2,3.定義s3c24xx_485_startupstatic int s3c24xx_4

11、85_startup(struct uart_port *port)struct s3c24xx_uart_port *ourport = to_ourport(port);int ret;#if defined(CONFIG_S5P_UART_DMA_EN)unsigned int ucon;#endif/=if (port->line = 0) /COM0(GPC7)->LED3(GPK6)s3c_gpio_cfgpin(S3C64XX_GPK(6), S3C_GPIO_OUTPUT);/GPK6/LED3配置成輸出狀態(tài)gpio_set_value(S3C64XX_GPK(6)

12、,1);/GPK6/LED3默認(rèn)滅/-s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C_GPIO_OUTPUT);/COM0(GPC7)配置成輸出狀態(tài)gpio_set_value(S3C64XX_GPC(7), 0);/COM0(GPC7)默認(rèn)0,常接收if (port->line = 2) /COM2(GPC6)->LED4(GPK7)s3c_gpio_cfgpin(S3C64XX_GPK(7), S3C_GPIO_OUTPUT);/LED4(GPK7)配置成輸出狀態(tài)gpio_set_value(S3C64XX_GPK(7),1);/LED4(GPK7)默認(rèn)

13、滅/-s3c_gpio_cfgpin(S3C64XX_GPC(6), S3C_GPIO_OUTPUT);/COM2(GPC6)配置成輸出狀態(tài)gpio_set_value(S3C64XX_GPC(6), 0);/COM2(GPC6)默認(rèn)0,常接收/=dbg("s3c24xx_serial_startup: port=%p (%08lx,%p)n", port->mapbase, port->membase);rx_enabled(port) = 1;ret = request_irq(ourport->rx_irq, s3c24xx_serial_rx_ch

14、ars, 0, s3c24xx_serial_portname(port), ourport);if (ret != 0) printk(KERN_ERR "cannot get irq %dn", ourport->rx_irq);return ret;ourport->rx_claimed = 1;dbg("requesting tx irq.n");tx_enabled(port) = 1;ret = request_irq(ourport->tx_irq, s3c24xx_485_tx_chars, 0, s3c24xx_ser

15、ial_portname(port), ourport);if (ret) printk(KERN_ERR "cannot get irq %dn", ourport->tx_irq);goto err;ourport->tx_claimed = 1;dbg("s3c24xx_serial_startup okn");/=#if defined(CONFIG_S5P_UART_DMA_EN)if (s3c2410_dma_request(ourport->dma_ch_tx, &s5p_uart_dma_client, NULL

16、) printk(KERN_ERR "unable to get DMA channel for UART tx.n" );ourport->dma_ch_tx = 0;goto err; s3c2410_dma_set_buffdone_fn(ourport->dma_ch_tx, s5pc1xx_uart_tx_buffdone);s3c2410_dma_set_opfn(ourport->dma_ch_tx, NULL);s3c2410_dma_devconfig(ourport->dma_ch_tx, S3C2410_DMASRC_MEM,

17、0, (port->mapbase + S3C2410_UTXH) );s3c2410_dma_config(ourport->dma_ch_tx, S3C_DMA_XFER_BYTE, 0);s3c2410_dma_setflags(ourport->dma_ch_tx, S3C2410_DMAF_AUTOSTART);/for rx if (s3c2410_dma_request(ourport->dma_ch_rx, &s5p_uart_dma_client_rx, NULL) printk(KERN_ERR "unable to get DMA

18、 channel for UART rx.n" ); ourport->dma_ch_rx = 0; goto err; s3c2410_dma_set_buffdone_fn(ourport->dma_ch_rx, s5pc1xx_uart_rx_buffdone); s3c2410_dma_set_opfn(ourport->dma_ch_rx, NULL); s3c2410_dma_devconfig(ourport->dma_ch_rx, S3C2410_DMASRC_HW, 0, (port->mapbase + S3C2410_URXH) )

19、; s3c2410_dma_config(ourport->dma_ch_rx, S3C_DMA_XFER_BYTE, 0); s3c2410_dma_setflags(ourport->dma_ch_rx, S3C2410_DMAF_AUTOSTART); ucon = rd_regl(port, S3C2410_UCON); ucon &= (S3C2410_UCON_RXDMAMODE_MASK); ucon |= S3C2410_UCON_RXDMAMODE_SIG1; wr_regl(port, S3C2410_UCON, ucon); ucon = rd_reg

20、l(port, S3C2410_UFCON); ucon &= (3<<4); wr_regl(port, S3C2410_UFCON, ucon); ourport->rx_buf.buf = 0; ourport->rx_buf.buf = (unsigned char *)dma_alloc_coherent(NULL, UART_RX_SIZE, &rx_buf_dma_handle, GFP_KERNEL); ourport->rx_buf.head = 0; ourport->rx_buf.tail = 0; s3c2410_dm

21、a_enqueue(ourport->dma_ch_rx, (void *) ourport, (dma_addr_t) rx_buf_dma_handle, UART_RX_SIZE/2); s3c2410_dma_enqueue(ourport->dma_ch_rx, (void *) ourport, (dma_addr_t) (rx_buf_dma_handle + (UART_RX_SIZE/2) , UART_RX_SIZE/2); init_timer( &(ourport->rx_dma_timer) ); ourport->rx_dma_tim

22、er.data = (unsigned long)(ourport); ourport->rx_dma_timer.function = (void *)s5p_serial_rx_dma_timeout; ourport->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES; add_timer(&(ourport->rx_dma_timer);/for rx#endif/=/* the port reset code should have done the correct * register setup

23、for the port controls */return ret; err:s3c24xx_serial_shutdown(port);return ret;4.定義s3c24xx_485_tx_chars,英文注釋的內(nèi)容是關(guān)鍵static irqreturn_t s3c24xx_485_tx_chars(int irq, void *id)struct s3c24xx_uart_port *ourport = id;struct uart_port *port = &ourport->port;struct circ_buf *xmit = &port->st

24、ate->xmit;int count = 256;/-if (port->line = 0) /COM0(GPC7)->LED3(GPK6)gpio_set_value(S3C64XX_GPK(6),0);/發(fā)送前LED1燈亮gpio_set_value(S3C64XX_GPC(7),1);/發(fā)送前改為發(fā)送狀態(tài)if (port->line = 2) /COM2(GPC6)->LED4(GPK7)gpio_set_value(S3C64XX_GPK(7),0);/發(fā)送前LED1燈亮gpio_set_value(S3C64XX_GPC(6),1);/發(fā)送前改為發(fā)送狀

25、態(tài)/-if (port->x_char) wr_regb(port, S3C2410_UTXH, port->x_char);port->icount.tx+;port->x_char = 0;goto out;/* if there isnt anything more to transmit, or the uart is now * stopped, disable the uart and exit*/if (uart_circ_empty(xmit) | uart_tx_stopped(port) s3c24xx_485_stop_tx(port);goto

26、out;/* try and drain the buffer. */while (!uart_circ_empty(xmit) && count- > 0) if (rd_regl(port, S3C2410_UFSTAT) & ourport->info->tx_fifofull)break;wr_regb(port, S3C2410_UTXH, xmit->bufxmit->tail);xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);port->ico

27、unt.tx+;if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)uart_write_wakeup(port);if (uart_circ_empty(xmit)s3c24xx_485_stop_tx(port); out:return IRQ_HANDLED;5.最后定義s3c24xx_485_start_tx和s3c24xx_485_stop_txstatic void s3c24xx_485_start_tx(struct uart_port *port)struct s3c24xx_uart_port *ourport = to_

28、ourport(port);/-if (port->line = 0) /COM0(GPC7)->LED3(GPK6)gpio_set_value(S3C64XX_GPK(6),0);/發(fā)送前LED1燈亮gpio_set_value(S3C64XX_GPC(7),1);/發(fā)送前改為發(fā)送狀態(tài)if (port->line = 2) /COM2(GPC6)->LED4(GPK7)gpio_set_value(S3C64XX_GPK(7),0);/發(fā)送前LED1燈亮gpio_set_value(S3C64XX_GPC(6),1);/發(fā)送前改為發(fā)送狀態(tài)/-#if defined(CONFIG_S5P_UART_DMA_EN)if (!ourport->dma_busy) if (port->flags & UPF_CONS_FLOW)s3c24xx_s

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論