龙芯linux4.19中485串口驱动的调试

485串口与232串口的不用之处在于,485串口有一个换向引脚,通过相应的电平信号,完成串口控制器的收发操作。

1 在发送完成之后,将引脚拉低,以便准备接受,操作如下:

在8250_port.c文件中

serial8250_handle_irq->serial8250_tx_chars->__stop_tx(up)->__stop_tx_rs485->__do_stop_tx_rs485->serial8250_em485_rts_after_send(p);添加如下代码,nca9555为gpio控制芯片,是一个i2c设备。

static inline void serial8250_em485_rts_after_send(struct uart_8250_port *p)
{
	unsigned char mcr = serial8250_in_MCR(p);
	if (p->port.rs485.flags & SER_RS485_RTS_AFTER_SEND){
        pr_info("serial8250_em485_rts_after_send pin to 0\n");
		mcr |= UART_MCR_RTS;
		//I2cSetSlave(NODE0_I2C0_BASE,NCA9555_I2C_ADDR_WR);
		//I2cInitSetFreq(NODE0_I2C0_BASE,CPU_I2C_CLOCK,250000,0x3a);
		I2cCtlWrite (NODE0_I2C0_BASE, NCA9555_I2C_ADDR_WR, REGISTER_0_CONFIGURATION_PORT, 2, &setBuff[0]);
		I2cCtlWrite (NODE0_I2C0_BASE, NCA9555_I2C_ADDR_WR, REGISTER_0_OUTPUT_PORT, 2, &setBuff[0]);
	}else{
//	pr_info("serial8250_em485_rts_after_send end\n");
	}

	//else{
	//	mcr &= ~UART_MCR_RTS;
	//	I2cSetSlave(NODE0_I2C0_BASE,NCA9555_I2C_ADDR_WR);
	//	I2cInitSetFreq(NODE0_I2C0_BASE,CPU_I2C_CLOCK,250000,0x3a);
	//	I2cCtlWrite (NODE0_I2C0_BASE, NCA9555_I2C_ADDR_WR, REGISTER_0_CONFIGURATION_PORT, 2, &setBuff[0]);
	//	I2cCtlWrite (NODE0_I2C0_BASE, NCA9555_I2C_ADDR_WR, REGISTER_0_OUTPUT_PORT, 2, &setBuff[0]);
	//}

	serial8250_out_MCR(p, mcr);
}

2在8250_core.c文件中

serial8250_register_8250_port中添加如下代码

    memset((void *)&up->port.rs485, 0, sizeof(up->port.rs485));
    up->port.rs485_config = serial8250_rs485_config;

实现rs485_config接口,此举是为了在应用层使用ioctl函数进行rs485_config。

接口实现如下,在使能485时,将引脚拉低。

int serial8250_rs485_config(struct uart_port *port,
                   struct serial_rs485 *rs485)
{
    
		
		struct uart_8250_port *p= container_of(port,struct uart_8250_port,port);
		//serial8250_em485_init(p);
		if (rs485->flags & SER_RS485_ENABLED) {
  //      pr_info("enable 485 set pin to 0\n");
		//I2cSetSlave(NODE0_I2C0_BASE,NCA9555_I2C_ADDR_WR);
		I2cInitSetFreq(NODE0_I2C0_BASE,CPU_I2C_CLOCK,250000,0x3a);
		I2cCtlWrite (NODE0_I2C0_BASE, NCA9555_I2C_ADDR_WR, REGISTER_0_CONFIGURATION_PORT, 2, &setBuff[0]);
		I2cCtlWrite (NODE0_I2C0_BASE, NCA9555_I2C_ADDR_WR, REGISTER_0_OUTPUT_PORT, 2, &setBuff[0]);
		serial8250_em485_init(p);
        //gpio_485_set_direction(true);
        //gpio_485_set_value(false);
        //tasklet_init(&s485_tasklet, serial8250_485_do_tasklet, (unsigned long)&up->port);
    }
    else {
  //      printk(KERN_INFO "uart %d set 485 offn", port->line);
    }


    memcpy(&port->rs485, rs485, sizeof(*rs485));

    return 0;
}

485串口基本修改如上。

<think>好的,用户想了解如何通过串口龙芯2K0300久久派上进行远程调试和文件传输。首先,我需要确认串口连接的基本步骤。龙芯2K0300通常使用UART接口,用户需要准备USB转TTL模块,连接正确的引脚,比如TX、RX和GND。然后,在电脑上安装驱动,使用终端工具如PuTTY或Minicom,设置正确的波特率,通常是115200。 接下来是远程调试部分。可能需要使用调试工具如gdb,但串口调试可能需要配置gdbserver,或者直接通过串口进行内核调试。这里需要查证龙芯的具体文档,确认是否支持通过串口进行调试,以及具体的命令和步骤。 然后是文件传输。由于串口本身不支持直接传输文件,常用的方法可能是使用Xmodem、Ymodem或Zmodem协议。需要安装相应的工具,如lrzsz,在Linux系统下使用sz和rz命令发送和接收文件。用户需要在久久派上安装这些工具,并在终端中配置正确的传输协议。 可能还需要考虑权限问题,比如用户是否有权限访问串口设备,是否需要root权限。另外,确认串口设备的名称,比如/dev/ttyUSB0或/dev/ttyS0,以及正确的权限设置,可能需要使用chmod或者将用户加入dialout组。 用户可能会遇到的问题包括连接不稳定、波特率不匹配、文件传输中断等,需要提供一些常见故障排除方法,比如检查接线、确认波特率、重新插拔USB设备等。 还需要考虑操作系统的兼容性,用户是在Windows还是Linux下操作,不同系统下的工具可能不同。例如,Windows下使用PuTTY和Tera Term,而Linux下使用Minicom和picocom。 最后,是否需要编写自动化脚本或配置环境变量来简化流程,比如在.bashrc中添加快捷命令,或者使用脚本自动启动文件传输。 现在需要整理这些步骤,确保逻辑清晰,分点说明,并验证每个步骤的正确性,参考官方文档或可靠来源,确保信息的准确性。可能还需要提供具体的命令示例,比如如何启动minicom,如何发送文件,如何启动调试会话等。</think>### 龙芯2K0300久久派串口远程调试与文件传输方法 #### 一、串口连接配置 1. **硬件准备** - 使用USB转TTL模块(如CH340/CP2102),连接久久派的UART引脚: - TX接模块的RX - RX接模块的TX - GND接模块的GND - 供电需独立,避免电流不稳导致通信失败[^1]。 2. **驱动安装与端口识别** - Windows:安装对应USB转TTL芯片驱动,设备管理器中查看端口号(如`COM3`)。 - Linux:自动识别为`/dev/ttyUSB0`,使用`ls /dev/tty*`确认。 3. **终端工具配置** - **Windows推荐工具**: - PuTTY:选择`Serial`模式,设置波特率`115200`,数据位`8`,停止位`1`,无校验。 - Tera Term:支持Zmodem协议传输文件。 - **Linux推荐工具**: ```bash sudo apt install minicom minicom -D /dev/ttyUSB0 -b 115200 ``` #### 二、远程调试方法 1. **内核调试** - 通过UART启动KGDB(需内核支持): - 修改内核启动参数,添加`kgdboc=ttyS0,115200`。 - 调试端使用GDB连接: ```bash gdb vmlinux (gdb) target remote /dev/ttyUSB0 ``` 2. **应用层调试** - 使用`gdbserver`通过串口转发调试信息(需交叉编译工具链): ```bash # 目标板执行 gdbserver /dev/ttyS0 ./your_program # 主机执行 arm-linux-gnueabi-gdb ./your_program (gdb) target remote /dev/ttyUSB0 ``` #### 三、文件传输方法 1. **Zmodem协议传输** - 目标板安装`lrzsz`: ```bash opkg update && opkg install lrzsz ``` - **发送文件到目标板**: ```bash # 主机执行 sz --zmodem filename ``` - **从目标板接收文件**: ```bash # 目标板执行 rz --zmodem ``` 2. **Python脚本传输(备用)** - 使用`pyserial`库编写简单传输脚本: ```python import serial ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) # 发送文件 with open('file.txt', 'rb') as f: ser.write(f.read()) # 接收文件 data = ser.read(1024) with open('received.txt', 'wb') as f: f.write(data) ``` #### 四、常见问题排查 - **无响应**:检查TX/RX是否反接,波特率是否一致。 - **传输中断**:降低波特率至`57600`,缩短接线长度。 - **权限不足**:Linux下执行`sudo usermod -aG dialout $USER`并重启。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值