TE2440-II 在2.6.28内核下面485驱动的问题。
斑竹:我根据客服的指导,在linux2.6.28下将samsum.c按照s3c2410.c里面的方式修改。
1.s3c24xx_serial_startup()中增加对S3C2410_GPG11的初始化。
代码如下:
static int s3c24xx_serial_startup(struct uart_port *port)
{
struct s3c24xx_uart_port *ourport = to_ourport(port);
int ret;
dbg("s3c24xx_serial_startup: port=%p (%08lx,%p)\n",
port->mapbase, port->membase);
rx_enabled(port) = 1;
ret = request_irq(RX_IRQ(port),
s3c24xx_serial_rx_chars, 0,
s3c24xx_serial_portname(port), ourport);
if (ret != 0) {
printk(KERN_ERR "cannot get irq %d\n", RX_IRQ(port));
return ret;
}
ourport->rx_claimed = 1;
dbg("requesting tx irq...\n");
tx_enabled(port) = 1;
ret = request_irq(TX_IRQ(port),
s3c24xx_serial_tx_chars, 0,
s3c24xx_serial_portname(port), ourport);
if (ret) {
printk(KERN_ERR "cannot get irq %d\n", TX_IRQ(port));
goto err;
}
ourport->tx_claimed = 1;
dbg("s3c24xx_serial_startup ok\n");
//add by Bruce
if (port->line == 2) {
//s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2);
//s3c2410_gpio_pullup(S3C2410_GPH6, 1);
//s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH7_RXD2);
//s3c2410_gpio_pullup(S3C2410_GPH7, 1);
s3c2410_gpio_cfgpin(S3C2410_GPG11, S3C2410_GPG11_OUTP);
s3c2410_gpio_pullup(S3C2410_GPG11, 0);
s3c2410_gpio_setpin(S3C2410_GPG11, 1);
} /* the port reset code should have done the correct
* register setup for the port controls */
return ret;
err:
s3c24xx_serial_shutdown(port);
return ret;
}
2.s3c24xx_serial_stop_tx()函数修改如下
static void s3c24xx_serial_stop_tx(struct uart_port *port)
{
if (tx_enabled(port)) {
disable_irq(TX_IRQ(port));
tx_enabled(port) = 0;
if (port->flags & UPF_CONS_FLOW)
s3c24xx_serial_rx_enable(port);
}
//add by Bruce
if (port->line == 2) {
printk("485_stop_tx\n");
s3c2410_gpio_setpin(S3C2410_GPG11, 0);
} //
}
3.s3c24xx_serial_start_tx()函数修改如下
static void s3c24xx_serial_start_tx(struct uart_port *port)
{
//add by Bruce
if (port->line == 2) {
printk("485_start_tx\n");
s3c2410_gpio_setpin(S3C2410_GPG11, 1);
}
// if (!tx_enabled(port)) {
if (port->flags & UPF_CONS_FLOW)
s3c24xx_serial_rx_disable(port);
enable_irq(TX_IRQ(port));
tx_enabled(port) = 1;
}
}
4.s3c24xx_serial_stop_rx()函数修改如下
static void s3c24xx_serial_stop_rx(struct uart_port *port)
{
if (rx_enabled(port)) {
dbg("s3c24xx_serial_stop_rx: port=%p\n", port);
disable_irq(RX_IRQ(port));
rx_enabled(port) = 0;
}
if (port->line == 2) {
printk("485_start_tx\n");
s3c2410_gpio_setpin(S3C2410_GPG11, 1);
}}
红色部分是根据s3c2410.c更改的。头文件还做了些更改。编译过后串口1可以正常的使用,但是485这边就无法正常的收发。请斑竹看看这里的更改是否有误。谢谢! 看看电路,是不是,1,0弄返了啊? 斑竹,我在2.6.12内核下面都没有问题。然后将2.6.12内核下面s3c2410.c里面的代码拷贝到2.6.28内核下面的samsun.c里面。就通信不了了。所以觉得这个1和0应该没有问题。麻烦斑竹想一下还有什么可能性吧。如果有在2.6.28里面的驱动直接发代码给我就更好了。谢谢! 只添加进去gpio哪些操作,串口不要变 什么意思呢?我只是将S3C2410_GPG11相应的拉高置低,串口没有更改啊。请问斑竹是什么意思? 你用软件不停的输出串口信息,看该gpio能不能被控制啊?
这个你得结合硬件查问题啊~ 斑竹。我查了硬件。硬件本身没有问题。按照推断是驱动本身问题。
推断如下:
在同样硬件板子上运行2.6.12内核。板子发送,PC机接收,485驱动没有问题。
用示波器看ARM的S3C2410_GPH6和S3C2410_GPG11引脚波形如下:
在同样的板子上运行2.6.28内核(samsun.c代码如帖子修改)。板子发送,PC机接受。无法收到。
用示波器看ARM的S3C2410_GPH6和S3C2410_GPG11引脚波形如下:
由此推断是2.6.28内核中对于使能信号的拉低函数被提前调用。
因我对内核代码不是很了解,我也查了一下samsun.c这个文件,但是没有找到问题所在。请斑竹帮忙分析。谢谢! 回复 7# cyz331
传掉了一张图片,现补上。
最后这张是什么情况? 第一张是2.6.12内核正常情况下的波形。绿色的是发送数据,黄色的是片选信号。第二章是2.6.28内核下的波形。绿色的是发送数据,黄色的是片选信号。
页:
[1]
2