CH438 Linux 驱动详解

CH438是一款USB转串口桥接芯片,常用于嵌入式系统中,通过USB接口实现和PC机的串口通信,本文将详细介绍如何在Linux系统上移植和配置CH438驱动程序,以实现1并转8串的串口扩展,以下是详细内容:
一、CH438 Linux驱动
CH438驱动程序在Linux系统上的稳定性和性能至关重要,该驱动程序经过长期负载运行测试,所有串口在全双工高波特率(baudrate115200)下工作稳定,移植时需根据平台速度设置合适的读写速度,确保长期稳定工作。
二、硬件电路建议
1、外置有源晶振:建议使用外置有源晶振,因为内置振荡电路配合无源晶振极不稳定,可能导致停振。
2、引脚定义:
CS: 片选信号 (E17)
RD: 读信号 (E16)
WR: 写信号 (E15)
Address: E14~E08
Data: E07~E00
三、头文件ch438.h详解
#ifndef __CH438_H__
#define __CH438_H__
/* hardware interface */
#define CH438_BASE (SUNXI_PIO_PBASE+0x90) /* PE base */
#define CH438_CFG0 (ch438_membase+0x00) /* PE Configure Register 0, PE7~PE0 */
#define CH438_CFG1 (ch438_membase+0x04) /* PE Configure Register 1, PE15~PE8 */
#define CH438_CFG2 (ch438_membase+0x08) /* PE Configure Register 2, PE17~PE16 */
#define CH438_CFG3 (ch438_membase+0x0C)
#define CH438_DAT (ch438_membase+0x10) /* PE Data Register, PE17~PE0 */
#define CH438_DRV0 (ch438_membase+0x14) /* PE Multi-Driving 0, PE15~PE0 */
#define CH438_DRV1 (ch438_membase+0x18) /* PE Multi-Driving 1, PE17~PE16 */
#define CH438_PULL0 (ch438_membase+0x1C) /* PE Pull 0, PE15~PE0 */
#define CH438_PULL1 (ch438_membase+0x20) /* PE Pull 1, PE17~PE16 */
#define GPIO_RANGE 0x24
#define CH438_CS 17
#define CH438_RD 16
#define CH438_WR 15
struct ch438_pin {
int rst, pint;
int irqnum;
};
struct ch438_port {
struct uart_port port;
char name[16];
unsigned char id;
unsigned char acr;
unsigned char ier;
unsigned char lcr;
unsigned char mcr;
unsigned char fcr;
unsigned char dll;
unsigned char dlh;
unsigned char msr_saved_flags;
unsigned int lsr_break_flag;
unsigned int io_num;
struct ch438_pin *pin;
};
#define CH438_MEM_BASE SUNXI_GPIOE_BASE
#define RBR_RO 0x00 /* Received Buffer Register */
#define THR_WO 0x00 /* Transmit Holding Register */
#define IER_RW 0x01 /* Interrupt Enable Register */
#define IIR_RO 0x02 /* Interrupt Identification Register */
#define FCR_WO 0x02 /* FIFO Control Register */
#define LCR_RW 0x03 /* Line Control Register */
#define MCR_RW 0x04 /* Modem Control Register */
#define LSR_RO 0x05 /* Line Status Register */
#define MSR_RO 0x06 /* Modem Status Register */
#define SCR_RW 0x07 /* Scratch Register */
#define DLL_RW 0x00 /* Divisor latch (LSB) */
#define DLH_RW 0x01 /* Divisor latch (MSB) */
#define SSR_RO 0x4F /* all interrupt status */
#define BIT_IER_RESET BIT(7) /* IER register bit for reset */四、移植与配置步骤
1. 准备工作

确保硬件电路连接正确,特别是外置有源晶振的使用。
确认平台速度,并根据此设置合适的读写速度。
2. 修改内核配置
在Linux内核配置中添加对CH438的支持,通常可以通过修改Makefile和Kconfig文件来实现。
确保CONFIG_SERIAL_CH438=y在内核配置中被选中。
3. 编写驱动代码
根据CH438的寄存器标准,编写相应的驱动程序代码,可以参考现有的8250驱动,并进行必要的调整。
主要修改底层硬件通讯的代码,替换成实际的并口操作。
4. 编译与测试
编译修改后的的内核,并将新内核烧录到目标设备上。

使用串口调试工具测试CH438的功能,确保所有串口在全双工高波特率下工作稳定。
五、常见问题与解答
Q1: CH438能否直接使用Linux的8250驱动?
A1: CH438的寄存器符合16C550标准,可以基于内核的8250驱动稍作调整适配,但需要注意,不要直接使用8250的驱动框架,因为存在明显区别,可能会影响其他类8250芯片的正常工作。
Q2: 如何获取CH438的Linux代码?
A2: 可以通过邮件联系相关技术支持获取CH438的Linux代码,或者参考开源社区提供的类似项目。
CH438 Linux驱动的移植和配置需要细致的硬件电路设计和合理的软件配置,通过正确的步骤和方法,可以实现高效、稳定的串口扩展功能。
到此,以上就是小编对于“ch438linux驱动”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/42906.html<
