串口扩展(基于安卓系统的wk2204串口扩展芯片驱动设计)_第1页
串口扩展(基于安卓系统的wk2204串口扩展芯片驱动设计)_第2页
串口扩展(基于安卓系统的wk2204串口扩展芯片驱动设计)_第3页
串口扩展(基于安卓系统的wk2204串口扩展芯片驱动设计)_第4页
串口扩展(基于安卓系统的wk2204串口扩展芯片驱动设计)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于android的wk2204串口扩展芯片驱动设计1x迅猛发展的android系统android (安卓)是it巨头谷歌公司推出的一款手机系统,是建立在linux 内核的基础z上的,能够迅速建立手机软件的解决方案。android的功能十分强 大,作为一项个新兴的热点已经成为软件行业中的一股新兴力量。2、驱动介绍驱动是硕件和软件之间的媒介和载体,是计算机等电子产品运行的根本。和 其他系统一样,在android手机中也经常需要使用一些外部硬件设备,如蓝牙耳 机、存储卡和摄像头。想要使用这些外部设备,就需要安装对应的驱动程序。驱 动程序是添加到操作系统中的一段代码。这段代码主要扮演一个沟通的角色,

2、负 责把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让他开始工作。wk2204是成都为开微电子有限公司最新的串口扩展芯片,该串口扩展芯片 最大的特点如下:2.1总体特性“ 支持多种主机接口:可以选择uart, spi, iic超大硬件收发缓存,支持256级fifo 低功耗设计,可以配置自动休眠,自动唤醒模式(us级唤醒) 宽工作电压设计,工作电压为2. 0v3. 6v精简的配置寄存器和控制字,操作简单可靠j提供工业级产品 高速cmos工艺,子串口速率最高可达1. 5mbps3. 3v、lmbps2. 5v*采用符合绿色环保政策的qfn24无铅封装2. 2扩展子通道uart特性* 子通

3、道串口独立配置,高速、灵活:每个子串口为全双工,每个子串口可以通过软件开启/关闭波特率可以独立设置,子串口最高可以达到1. 5m bps每个子串口字符格式包括数据长度、停止位数、奇偶校验模式可以独立设置完善的子串口状态查询功能可以实现对单个子串口软件复位“ fifo功能:每个子串口具备独立的256级发送fifo,发送fifo触发点可按用户需求进行编程每个子串口具备独立的256级接收fifo,接收fifo触发点可按用户需求进行编程 软件fifo使能和清空fifo状态和计数器输出流量控制:支持rts、cts的硬件白动流量控制支持xon/xoff的软件自动流量控制,xon/xoff可编程字符自动发送

4、/识别 rs-485功能:rts控制的口动rs-485收发控制rs-485网络地址自动识别功能rs-485数据长度可编程配置为8bi t或9b i t“错误检测:支持奇偶校验错误、数据帧错误、溢出错误及line-break错误检测支持起始位错误检测 内置符合sir标准的wda红外收发编解码器,传输速度可达115. 2k bit/s中断特点:具备子串口接收fifo超吋中断支持li ne-break错误中断2.3 uart主接口特性 主接口为标准的三线uart串口 (rx, tx, gnd),无需其它地址信号、控制信号线 波特率自适应技术,最高速度可以达到1.5m bit/s可选择的奇校验,偶校验

5、和无校验模式 无需地址线控制的串口扩展方式,通过芯片内置的协议处理器实现多串口扩展“ uart主接口可以通过引脚设置为红外模式支持最长16字节连续收发2.4 spi主接口特性最高速度10m bit/s仅支持spi从模式 spt模式0支持最长256字节连续收发2.5 iic主接口特性支持iic总线接口 最高速度1m bit/s仅支持tic从模式j支持最长16字节连续收发3、andr iod架构分析andriod作为一个移动设备的平台,其软件层次结构包括操作系统、中间 件和应用程序。根据android的软件框图,其软件层次结构自下而上分为4层。(1) 操作系统层(os)(2) 各种库(librar

6、y)和 andriod 运行环境(runtime)(3) 应用程序框架(application framework)(4)应用程序(application)具体框图结构如下图:java应用程序java应用程序框架applicationshomecontxtsphonebrowserwmdow managercontent prwdenviewnotifkioonsystemmanagertelephony minijerresource mimger辟xmpp servicelibrariesandroid runtimemedia frameworksql»«cort u

7、bnricifrtctypcvbkitmkhincsslapplication frameworkactfvity mincerc/c+本地库和 android 运行时环境i alinux内核与驱动f3.1操作系统层android使用iinux2.6作为操作系统,iinux2.6是一种标准的技术,也是一种开放的操作系统。android对操作系统的使用包括linux内核和驱动程 序两部分。虽然android用的是linux的内核,但是android并没有完全照搬 linux系统内核,除了对linux进行部分修正,还增加了不少内容。android 驱动主要分为两种类型:android专用的驱动和a

8、ndroid使用的设备驱动(通 常都是标准的linux驱动)。3.2库和android运行环境本层次对应一般嵌入式系统,相当于中间件层次。android的本层次分为 两部分,一个是各种库(library),另一个是android运行的环境。suffice minceropengliesmux kerntusb dnverkeypad driverwf dnveraudio drivenwu«ooth doverpower mmigementbwxler (1pc) dnverfhih memory dnver3.3应用程序android的应用程序(application)主要是用户界

9、面方面的,通常 以java程序编写,其中还是可以包含各种资源文件。java程序及和关资源经过 编译过后的apk包。3.4应用程序框架android的应用程序框架为应用程序层的开发者提供api,它实际上是一 个应用程序的框架。由于上层的应用程序是以java构建的,因此本层次 提供的首先包含了 ui程序中所需要的各种控件,例如view(视图组件), 其中又包括了 list (列表)、grid(栅格)、textbox(文本框)、button (按 钮)等,甚至一个嵌入式的web浏览器。4、android驱动android驱动主要分两种类型:android专用驱动和android使用的设备 驱动(li

10、nux)oandroid专有驱动程序:1)android ashmem匿名共享内存;为用户空间程序提供分配内存的机 制,为进程间提供大块共享内存,同时为内核提供冋收和管理这个内存。2) an droid logger轻量级的log (日志)驱动;3) android binder基于openbinder框架的一个驱动;4) android power management 电源管理模块;5) low memory killer低内存管理器;6) android pmem物理内存驱动;7) usb gadgetusb驱动(基于gaeget框架);8) ram console用于调试写入日志信息的

11、设备;10) android alarm硬件时钟;android上的常用设备驱动:1) framebuff显示驱动;2) event输入设备驱动;3) alsa音频驱动;4) oss音频驱动;5) v412摄像头:视频驱动;6) mtd驱动;7) 蓝牙驱动;8) wlan设备驱动;5、android下的串口驱动android下的设备驱动和linux的设备驱动基木没有太大的变化。linux 下的设备主要分为块设备、字符设备和网络设备。串口是一种典型的字符设 备,linux系统根据这类字符设备自身的特点,把他们再重新整理出tty设备。tty设备通常都是指终端设备,比如对应于输入设备键盘鼠标,输出设

12、 备显示器的控制终端和串口终端,这类设备驱动有着自身的一些共同特点, 然后抽象出共同特点做成通用的结构。5.1、tty 设备linux内核中tt丫的层次结构如下图,包含tty核心、tty线路规程和tty驱动。tty核心主要是提供和文件系统之间的接口,完成驱动的注册。社y线 路规程是以特殊的方式格式化來自用户或者硬件的数据,常常都是采用协议 转化的方式,比如:bluetoothotty驱动主要是直接操作硬件。用户空间(read.writejoctl.,)ttv coreline disciplinetty.driverhardware5.2、tty驱动程序的主要结构如上图所示,tty驱动相关的主

13、要源文件和数据流向。ttyjo.c定义了 tty设 备通用的file_operition 结构体并实现了接口函数 tty_register_driver ()用于注册 tty 设备,它会利用fs/char_dev.c提供的接口函数注册字符设备,与具体设备对应 的tty驱动将实现tty_driver结构体中的成员函数。同吋tty_io.c也提供了 tty_register_ldisc ()接口函数用于注册线路规程,n_tty.c文件则实现了 tty_dis 结构体屮的成员。特定tty设备驱动的主体工作是填充tty_driver结构体中的成员,并实现其中 的成员函数。5.3、串口驱动程序串口驱动其

14、实按照上面的结构来设计,即定义tty_driver并实现其中的成员 函数,但是linux内核己经在serial_core.c中实现了串口设备的通用tty驱动层, 这样串口驱动的主要任务演变成实现serial_core.c中定义的一组uart.xxx接m,主要是如下3个结构体:xxx_driver,xxx_port,xxx_opso具体的串口驱动程序结 构如下图6、wk2204串口扩展芯片驱动分析(spi转串口)wk2204系列串口扩展芯片的驱动程序结构正是采用的上面串口驱动程序的结 构,那么wk2204串口驱动的工作就是完成wk2xxx_spi.c中的结构体并完成其 屮的成员函数,还有就是完成

15、模块的加载和卸载函数。那么我们主要的工作就是 完成 wk2xxx_spi.c 中的 wk2xxx_driver, wk2xxx_port, wk2xxx_pops 这 3 个结 构体。这三个结构体和tty设备结构体有着如下图对应的关系:6.1 > 结构体 wk2xxx_drivertty核心层核心层wk2xxx 驱动层该结构体主要定义驱动相关的一些信息,如设备号、驱动名,设备名等static struct uart_driver wk2xxx_uart_driver = owner:this_module,major:serial wk2xxx major,#ifdef config_d

16、evfs_fsdriver_ name:"ttyswk11,dev name:httyswkh,# elsedriver_ name:dev_name:# endifminor:nr:cons:;6.2 结构体 wk2xxx_port” ttyswk”,” ttyswk”,minor_start,nr_ports,null/wk2xxx_consolewk2xxx_port结构体用于描述一个uart端口的i/o端口或者i/o内存地址、fifo大小、端口类型等信息。struct wk2xxx_port/struct timerjist mytimer;struct uart_port

17、port;/nr_ports;struct spldevice *spi_wk;spinlock_t confjock;/* shared data */struct workqueue_struct *workqueue;struct work_struct work;int suspending;void (*wk2xxx_hw_suspend) (int suspend);int tx_do ne;int force_end_work;int irq;int minor; /* minor number */int tx_empty;int tx_empty_flag;/int star

18、t_tx;int start_tx_flag;int stop_tx_flag;int stop_rx_flag;int irq_flag;int conf_flag;int tx_empty_fail;int start_tx_fail;int stop_tx_fail;int stop_rx_fail; int irq_fail;uint8_t newjcr;uint8_t new_scr;/*set baud of register*/ uint8_t new_baud1; uint8_t new_baudo; uint8_t new_pres;;6.3 结构体 wk2xxx_popsw

19、k2xxx_pops定义了对uart的-系列操作,包括发送、接收、线路设置等,如果说tty_driver中的tty_operationgs对于串口还比较抽象,那么wk2xxx_pops则直接面向串口,直接操作串口。wk2204的驱动的主要工作就是实现该结构体的相关成员函数。static struct uart_ops wk2xxx_pops = tx_empty:wk2xxx_tx_empty,set_mctrl:wk2xxx_set_mctrl,get_mctrl:wk2xxx_get_mctrl,stop_tx:wk2xxx_stop_tx,start_tx:wk2xxx_start_tx

20、,stop_rx:wk2xxx_stop_rx,break_ctl:wk2xxx_break_ctl,startup:wk2xxx_startup,shutdow n:wk2xxx_shutdow n,set_termios:wk2xxx_termios,type:wk2xxx_type,release_port:wk2xxx_release_port,request_port:wk2xxx_request_port,con fig_port:wk2xxx_c on fig_port,verify_port:wk2xxx_verify_port,;6.4 总线匹配函数 wk2xxx_probe

21、(struct spi_device *spi) static int devinit wk2xxx_probe(struct spldevice *spi)#ifdef _debug_wk2xxxprintk(kern_alert h-wk2xxx_probe()innh); #endifuint8_t i;int status;static volatile unsigned long *gpbcon_addr;#define gpbconwwwww 0xe020004cgpbcon_addr = ioremap(gpbconwwwww, 4);status = *gpbc on _add

22、r;printk(kern_err ”gpb_drv= ox%xnh,status);*gpbcon_addr |= oxaaoo;status = *gpbc on_ addr;printk(kern_err ”gpb_drv= ox%xn,t,status);printk(kern_alert mwk2xxx_probe wk2xxxnn);mutex_lock(&wk2xxxs_lock);if(!ua rt_d rive r_regi ste red)u a rt_d r i ve r_reg i ste re d = 1;status=uart_register_driver

23、(&wk2xxx_uart_driver);if (status)printk(kern_err "couldn't register wk2xxx uart drivern");mutex_unlock(&wk2xxxso ck);return status;printk(kern_alert ,wk2xxx_serialinit()nn);for(i =0;i<nr_ports;i+)struct wk2xxx_port *s =& wk2xxxsi;/container_of(port,structvk32xx_port,port);s->tx_do ne =0;s->spi_wk = spi;s->portine = i;s->port.ops = &wk2xxx_pops;s->port.uartclk = wk_crastal_clk;s->port.fifosize = 16;s->port.iobase = i+1;s->port.irq = irq_wk2xxx;s->port.iotype = serial_io_port;s->por

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论