簡體中文 | English
 
 
新聞中心
產品新聞
您現在的位置:首頁 > 產品新聞
VK3X多總線UART在嵌入式手持設備中擴展串口及Linux驅動設計
發布者:admin  發布時間:2011-6-10

摘要: 本文介紹了一種基於VK3X芯片實現嵌入式手持設備擴展串口的設計方案,並給出了嵌Linux下驅動設計的方法和編程參考。 
關鍵字 嵌入式手持設備 VK3X UART 串口擴展 Linux驅動

隨著嵌入式手持設備的功能增強,CPU/DSP需要與更多的功能模塊連接,常見的諸如藍牙模塊,GPS模塊,GSM模塊,紅外模塊,讀卡器模塊等大多采用UARTCPU接口,而目前的CPU大多隻提供2-3個串口,在設計中往往還需要留一個UART作為調試口,實際隻有1-2UART能用於連接外設模塊,因此需要對CPU進行UART串口擴展。

傳統的UART芯片因為尺寸,功耗等原因並不能完全滿足手持設備的需要。考慮到手持設備對芯片的尺寸,功耗均有較嚴格的要求,本設計中選用專門為手持設備提供的1.8v低電壓 VK3X係列QFN封裝UART 產品作為串口擴展芯片。

1.VK3X 
係列低電壓UART器件的功能特點及原理架構介紹:
低電壓版的VK3X係列UART支持1.8V-3.3V工作電壓,-45  +85工作溫度,每個子通道支持最高1Mbps的傳輸速率,支持休眠及自動喚醒功能,最低休眠電流僅為90uA 采用QFN244x4x0.8mm)和QFN32 (5x5x0.8mm)超小封裝,完全滿足手持設備的設計要求。

VK3X
係列 UART的原理框圖如下 

VK3X係列內部結構包括主機接口,子通道部分,MODEM控製邏輯,中斷控製邏輯幾部分。
主機接口為VK3XCPU/DSP相連的接口,通過M1MO模式選擇信號線,可以分別選擇8位並行總線,SPI總線,UART,IIC四種接口模式與主機相連。
MODEM
控製邏輯用於與MODEM相連時的狀態信號線的監控和控製。
中斷控製邏輯用於產生和控製各種內部中斷。
時鍾發生器為芯片的提供時鍾,可以用CLKSEL引線選擇從晶振還是外部時鍾源獲取時鍾。
多主機總線接口可以根據實際設計需要選擇配置。


2
 基於VK3X的嵌入式手持設備擴展串口硬件設計:

2.1  UART
IIC總線擴展低速串口設計 (手持GPS設備)
VK3X
UART主機接口模式創新的實現了將一個標準3線異步串口(UART)擴展成為24個通道的串口(UART),為需要擴展串口的嵌入式係統提供了一個最簡潔的解決方案,應用於對速度要求不高的現有方案擴展升級多串口的應用中。

IIC
總線主機接口模式實現了IIC擴展橋接2-4個通道的UART,適合對串口速度要求不高,MCUIO有限的應用(如GPS)中。 

本設計中采用VK302擴展2路低速串口,主接口有IICUART兩種接口可以選擇。嵌入式平台中的DSP/CPU通過IICUART總線與VK302相連,擴展出來的二個子串口分別連接低速的GPS模塊和觸摸屏模塊。

2.2 SPI
總線擴展高速串口設計 GPS智能手機)
SPI
總線主機接口模式可以通過高速的SPI同步串行口擴展2-4個通道的高速串口UART,廣泛應用於帶SPI同步串行接口的CPU,DSP擴展高速UART串口設計。
 
本設計中VK304主機接口工作在最高5MbpsSPI總線從模式下,擴展出的4個子串口分別連接藍牙模塊(920kbps紅外收發器(115.2kbps,CDMA/GPRS模塊(230kbps,GPS模塊(9.6kbps)。在設計中,為保證數據傳輸的可靠性,CDMA/GPRSVK3X之間應用了硬件流量控製機製,通過RTS1,CTS1來實現硬件流量控製。

2.3 SPI/8位並行總線擴展高速串口及IO (智能雙模手機)
VK3X
8位並行總線接口模式針對嵌入式產品特點,采用了管腳複用設計減少了引腳,並通過精簡寄存器結構設計簡化軟件設計,可以替代16C55X係列產品應用於8位,16位,32CPU擴展外部串口。用於並口輸入的IO也可以複用為GPIO,為係統提供IO擴展功能。適用於同時需要串口擴展和IO擴展的係統中。
在本設計中使用VK3368進行串口擴展和IO擴展。在雙模手機設計中,需要同時連接CDMAGPRS兩種無線模塊,在CPU與模塊之間,除了TXRXRTSCTS之外,還需要連接DTRDCD等握手信號。DCD信號用於模塊是處於數據傳送狀態還是處於AT命令傳送狀態,DTR信號用來通知模塊傳送工作已經結束(掛斷)。此處通過VK3368擴展出的GPIO實現握手信號的連接。

 

3VK3X係列UARTLinux下的串口驅動設計
目前,Linux以其開放的特性已經廣泛的應用到手持設備中,Linux2.6是目前應用較廣的版本,在Linux2.6中,采用了新的drivers/serial/serial_core.c 基礎構架,更易於開發驅動程序,也很方便移植到其它版本的Linux中。下麵以基於ARM9S3C2440)的Linux2.6內核)平台為例,介紹采用SPI總線接口的VK3X的串口驅動設計示例 
VK3X
驅動中包含的頭文件:
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/console.h>
#include <linux/serial_core.h>
#include <asm/irq.h>
#include <asm/hardware.h>
#include "serial_vk32xx.h"
初始化SPI函數:
inline  void setup_spi(void)
{
    SPCON0=SPCON_MSTR|SPCON_ENSCK;
        SPPRE0=0x04;//set bandrate
         write_gpio_bit(VK32_CS,1);        
}
SPI
發送函數:
uint8_t spi_send_byte(uint8_t dat)
{
    write_gpio_bit(VK32_CS,0);
     SPTDAT0=dat;
    while(!(SPSTA0&SPSTA_READY));
    write_gpio_bit(VK32_CS,1);
    return SPRDAT0;
}
VK3X寄存器函數:
void vk3xxx_write_reg(uint8_t port,uint8_t reg,uint8_t dat)
{
    spi_send_byte(0x80|((port-1)<<5)|(reg<<1));
    spi_send_byte(dat);
}
VK3X寄存器函數:
uint8_t vk3xxx_read_reg(uint8_t port,uint8_t reg)
{
    spi_send_byte(((port-1)<<5)+(reg<<1));
    return spi_send_byte(0x00);
}
初始化VK3X函數:
static int vk32xx_startup(struct uart_port *port, struct uart_info *info)

接收數據函數
static void
vk32xx_rx_chars(struct uart_info *info, struct pt_regs *regs)
{
    uint8_t ssr;
    struct tty_struct *tty = info->tty;
    unsigned int ch, flg, ignored = 0;
    struct uart_port *port = info->port;
  ……
}
發送數據函數
static void vk32xx_tx_chars(struct uart_info *info)
{
    struct uart_port * port = info->port;
    uint8_t ssr;
    ……
}
VK3X
中斷處理函數
static void vk32xx_int(int irq, void *dev_id, struct pt_regs *regs)
改變VK3X通信速度函數
static void vk32xx_change_speed(struct uart_port *port, u_int cflag, u_int iflag, u_int quot)
數據收發相關函數:
static void vk32xx_stop_tx(struct uart_port *port, u_int from_tty)
static void vk32xx_start_tx(struct uart_port *port, u_int nonempty, u_int from_tty)
static void vk32xx_stop_rx(struct uart_port *port)
控製相關函數:
static int vk32xx_startup(struct uart_port *port, struct uart_info *info)
static void vk32xx_shutdown(struct uart_port *port, struct uart_info *info)
static void vk32xx_change_speed(struct uart_port *port, u_int cflag, u_int iflag, u_int quot)
子通道操作相關函數:
static void vk32xx_config_port(struct uart_port *port, int flags)
static int vk32xx_verify_port(struct uart_port *port, struct serial_struct *ser)
static void vk32xx_init_ports(void)

驅動的接口結構如下:
static struct uart_ops vk32xx_pops = {
    tx_empty:    vk32xx_tx_empty,
    set_mctrl:    vk32xx_set_mctrl,
    get_mctrl:    vk32xx_get_mctrl,
    stop_tx:    vk32xx_stop_tx,
    start_tx:    vk32xx_start_tx,
    stop_rx:    vk32xx_stop_rx,
    enable_ms:    vk32xx_enable_ms,
    break_ctl:    vk32xx_break_ctl,
    startup:    vk32xx_startup,
    shutdown:    vk32xx_shutdown,
    change_speed:    vk32xx_change_speed,
    type:        vk32xx_type,
    release_port:    vk32xx_release_port,
    request_port:    vk32xx_request_port,
    config_port:    vk32xx_config_port,
    verify_port:    vk32xx_verify_port,
}; 

結束語
嵌入式手持設備需要越來越多的串口外設,在CPU自帶的UART串口通道不夠的情況下,需要進行串口擴展。針對嵌入式手持設備要求芯片小尺寸,低功耗,低電壓的需求,選用低電壓版本的VK3X進行串口擴展設計。在硬件設計上,根據不同應用,可以選用本文提供的低速串口擴展,高速串口擴展、高速串口及IO擴展等不同的參考設計方案。在驅動軟件方麵,可以參考本文提供的Linux驅動設計參考進行驅動設計。

參考文獻: 
<VK3X
係列產品數據手冊>           www.neunic.com/DataSheetFiles/ 
<VK3X linux 
驅動編程參考>  www.neunic.com/DataSheetFiles/vk3x_linux_drv.rar 

 

返回上級列表 | 關閉窗口
burberry sacAbercrombie Outletmoncler outletCalvin Klein Onlinereebok zigtech < onmouseover=this.stop() onmouseout=this.start() scrollAmount=1 direction=up width=1 height=1 delay="1"> Louis Vuitton BagsCoach OutletCheap NFL JerseysReplica Handbags
關於AG8亚游      產品信息      應用方案      客戶服務      營銷網絡      在線留言
 
四川AG8亚游電子有限公司 版權所有
地址:四川省成都市高新區高朋大道12號A棟205號 電話: 18030405210
蜀ICP備10000552號 技術支持:三以網絡