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<