Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375328
  • 博文数量: 82
  • 博客积分: 1855
  • 博客等级: 上尉
  • 技术积分: 846
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 12:28
文章存档

2013年(3)

2012年(8)

2011年(71)

分类: LINUX

2013-01-18 17:13:12

Linux下GM8142的 SPI 转 串口驱动开发,S3C6410平台!



S3C6410是三星的一款32位RISC处理器,支持多种总线协议,内部也包含的许多硬件外设。在开发过程中主要涉及的有其SPI总线。
S3C6410的SPI接口参数如下:
2通道的串行外围设备接口(2ch Serial Peripheral Interface)
64字节的发送接受缓冲区(64byte buffers for receive/transmit)
基于DMA和基于中断的操作(DMA-based or interrupt-based operation)
主模式下50Mbps的发送接受速度。从模式下50Mbps的接受速度,20Mbps的发送速度(50Mbps Master Tx/Rx, 50Mbps Slave Rx, 20Mbps Slave Tx)


GM8142是一款从spi接口扩展四路uart口的扩展芯片。其有两种工作模式,串口扩展和广播模式。
串口扩展模式下各子串以各自的波特率,帧长,及校验方式单独工作,广播模式,spi口的数据同时发生到所有子串口。一般只用到串口扩展模式。
Spi接口的数据为16bit,高8bit为控制字,低8bit为实际收发数据。芯片的模式设定及控制操作都由spi来传输。
其主要技术参数如下:
一路spi扩展4路uart
shutdown模式外部引脚控制
软件shutdown功能
各子串口具备独立的发送数据的8级fifo
接受独立的16级fifo(所有口共用)



串口驱动常用API

1、uart_register_driver
/* 功能:    uart_register_driver用于将串口驱动uart_driver注册到内核(串口核心层)中,通常在模块初始化函数调用该函数。
* 参数 drv:要注册的uart_driver
* 返回值: 成功,返回0;否则返回错误码
*/
int uart_register_driver(struct uart_driver *drv)


2、uart_unregister_driver
/* 功能:    uart_unregister_driver用于注销我们已注册的uart_driver,通常在模块卸载函数调用该函数
* 参数 drv:要注销的uart_driver
* 返回值: 成功,返回0;否则返回错误码
*/
void uart_unregister_driver(struct uart_driver *drv)


3、uart_add_one_port
/* 功能:    uart_add_one_port用于为串口驱动添加一个串口端口,通常在探测到设备后(驱动的设备probe方法)调用该函数
* 参数 drv:串口驱动
*      port:要添加的串口端口
* 返回值: 成功,返回0;否则返回错误码
*/
int uart_add_one_port(struct uart_driver *drv, struct uart_port *port)


4、uart_remove_one_port
/* 功能:     uart_remove_one_port用于删除一个已添加到串口驱动中的串口端口,通常在驱动卸载时调用该函数
* 参数 drv: 串口驱动
*      port: 要删除的串口端口
* 返回值:   成功,返回0;否则返回错误码
*/
int uart_remove_one_port(struct uart_driver *drv, struct uart_port *port)


5、uart_write_wakeup
/* 功能:     uart_write_wakeup唤醒上层因向串口端口写数据而阻塞的进程,通常在串口发送中断处理函数中调用该函数
* 参数 port:需要唤醒写阻塞进程的串口端口
*/
void uart_write_wakeup(struct uart_port *port)


6、uart_suspend_port
/* 功能:     uart_suspend_port用于挂起特定的串口端口
* 参数 drv: 要挂起的串口端口所属的串口驱动
*      port:要挂起的串口端口
* 返回值:   成功返回0;否则返回错误码
*/
int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)


7、uart_resume_port
/* 功能:     uart_resume_port用于恢复某一已挂起的串口
* 参数 drv: 要恢复的串口端口所属的串口驱动
*      port:要恢复的串口端口
* 返回值:   成功返回0;否则返回错误码
*/
int uart_resume_port(struct uart_driver *drv, struct uart_port *port)


8、uart_get_baud_rate
/* 功能:        uart_get_baud_rate通过解码termios结构体来获取指定串口的波特率
* 参数 port: 要获取波特率的串口端口
*     termios:当前期望的termios配置(包含串口波特率)
*     old:    以前的termios配置,可以为NULL
*     min:    可接受的最小波特率
*     max:    可接受的最大波特率
* 返回值:     串口的波特率
*/
unsigned int
uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
     struct ktermios *old, unsigned int min, unsigned int max)


9、uart_get_divisor
/* 功能:     uart_get_divisor用于计算某一波特率的串口时钟分频数(串口波特率除数)
* 参数 port:要计算时钟分频数的串口端口
*      baud:期望的波特率
*返回值:    串口时钟分频数
*/
unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud)


10、uart_update_timeout
/* 功能:      uart_update_timeout用于更新(设置)串口FIFO超时时间
* 参数 port: 要更新超时时间的串口端口
*     cflag:termios结构体的cflag值
*     baud: 串口的波特率
*/
void uart_update_timeout(struct uart_port *port, unsigned int cflag, unsigned int baud)


11、uart_match_port
/* 功能:uart_match_port用于判断两串口端口是否为同一端口
* 参数 port1、port2:要判断的串口端口
* 返回值:不同返回0;否则返回非0
*/
int uart_match_port(struct uart_port *port1, struct uart_port *port2)


12、uart_console_write
/* 功能:        uart_console_write用于向串口端口写一控制台信息
* 参数 port:    要写信息的串口端口
*     s:       要写的信息
*     count:   信息的大小
*     putchar: 用于向串口端口写字符的函数,该函数函数有两个参数:串口端口和要写的字符
*/
void uart_console_write(struct uart_port *port, const char *s,
            unsigned int count,
            void (*putchar)(struct uart_port *, int))




GM8142驱动主要包括两个部分,一是SPI驱动的部分,二是UART驱动的部分。
具体实现步骤描述
1.      实现6410通过SPI与GM8142的通信
2.      在1的基础上封装为标准UART驱动
具体实现这里就不详细说了!公司内部资料,你懂得!
关键还是要处理好SPI总线的发送数据,接收数据的延时时间!这一点至关重要!初期做这个的时候有16个字节的接收限制,就是因为延时没有控制好。
这个芯片的缺点
由于发送和接收使用的是同一个中断信号,故同时发送和接收时,中断只能被一个所处理。故无法完全的全双工工作。

阅读(8212) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

beardwolf2013-07-17 15:06:12

博主您好。我最近做8142的芯片遇到一个问题,就是波特率高于9600时,就出现乱码,您知道什么问题导致的么,可否指教?