全部博文(82)
分类: 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))