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内核下的波形。绿色的是发送数据,黄色的是片选信号。 这个gpio是不是被别的驱动里也复用了~
或者你换一个gpio试试~ 换一个GPIO?但是板子上的片选信号就是这个的嘛。难道要改电路? 斑竹,我把整个内核文件夹都搜索了一遍。只有在Regs-gpio.h和Samsung.c 这两个文件里面有。Regs-gpio.h里面是定义,而使用只有Samsung.c里面当485片选型号。所以不存在被其他驱动复用的问题。 换一个gpio试试吧~
你先能控制电平,然后飞线接 一下你的485控制端~ 试过了,换用GPG7飞线出来。把原来那根线割掉,结果一样。所以应该是驱动中什么地方提前调用了s3c24xx_serial_stop_tx()函数,请斑竹帮忙查一下。谢谢! 应用程序确定没有问题吗?
多打印点信息,dmesg看一下~ 应用程序没问题啦。我把串口换成串口二就能正常收发。只是换成485以后就不行了。多打印点信息是指什么,斑竹需要知道什么信息才能推断出问题的所在??????? 在你应用还有驱动程序里,写个gpio驱动,查看gpio控制的状态,啥时候被更改了啊~
你这个问题,需要自己跟踪代码,还有电路了~
不好一下看出来啊~
页:
[1]