嵌入式爱好者

查看: 10598|回复: 17

TE2440-II 在2.6.28内核下面485驱动的问题。

[复制链接]

4

主题

38

帖子

54

积分

AM335x通行证

扫一扫,手机访问本帖
发表于 2011-10-25 17:58:36 | 显示全部楼层 |阅读模式
斑竹:

我根据客服的指导,在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这边就无法正常的收发。请斑竹看看这里的更改是否有误。谢谢!
回复

使用道具 举报

0

主题

7131

帖子

0

积分

发表于 2011-10-26 08:11:07 | 显示全部楼层
看看电路,是不是,1,0弄返了啊?

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-26 10:51:38 | 显示全部楼层
斑竹,我在2.6.12内核下面都没有问题。然后将2.6.12内核下面s3c2410.c里面的代码拷贝到2.6.28内核下面的samsun.c里面。就通信不了了。所以觉得这个1和0应该没有问题。麻烦斑竹想一下还有什么可能性吧。如果有在2.6.28里面的驱动直接发代码给我就更好了。谢谢!

0

主题

7131

帖子

0

积分

发表于 2011-10-26 13:20:43 | 显示全部楼层
只添加进去gpio哪些操作,串口不要变

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-26 14:44:33 | 显示全部楼层
什么意思呢?我只是将S3C2410_GPG11相应的拉高置低,串口没有更改啊。请问斑竹是什么意思?

0

主题

7131

帖子

0

积分

发表于 2011-10-26 16:48:07 | 显示全部楼层
你用软件不停的输出串口信息,看该gpio能不能被控制啊?

这个你得结合硬件查问题啊~

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-27 20:17:20 | 显示全部楼层
斑竹。我查了硬件。硬件本身没有问题。按照推断是驱动本身问题。
推断如下:
在同样硬件板子上运行2.6.12内核。板子发送,PC机接收,485驱动没有问题。
用示波器看ARM的S3C2410_GPH6和S3C2410_GPG11引脚波形如下:

在同样的板子上运行2.6.28内核(samsun.c代码如帖子修改)。板子发送,PC机接受。无法收到。
用示波器看ARM的S3C2410_GPH6和S3C2410_GPG11引脚波形如下:


2.6.12内核下波形.png


由此推断是2.6.28内核中对于使能信号的拉低函数被提前调用。
因我对内核代码不是很了解,我也查了一下samsun.c这个文件,但是没有找到问题所在。请斑竹帮忙分析。谢谢!

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-27 20:18:27 | 显示全部楼层
回复 7# cyz331


   传掉了一张图片,现补上。
2.6.28内核下波形.png

0

主题

7131

帖子

0

积分

发表于 2011-10-28 08:12:43 | 显示全部楼层
最后这张是什么情况?

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-28 08:57:25 | 显示全部楼层
第一张是2.6.12内核正常情况下的波形。绿色的是发送数据,黄色的是片选信号。第二章是2.6.28内核下的波形。绿色的是发送数据,黄色的是片选信号。

0

主题

7131

帖子

0

积分

发表于 2011-10-28 13:11:49 | 显示全部楼层
这个gpio是不是被别的驱动里也复用了~

或者你换一个gpio试试~

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-28 18:25:42 | 显示全部楼层
换一个GPIO?但是板子上的片选信号就是这个的嘛。难道要改电路?

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-29 14:08:21 | 显示全部楼层
斑竹,我把整个内核文件夹都搜索了一遍。只有在Regs-gpio.h和Samsung.c 这两个文件里面有。Regs-gpio.h里面是定义,而使用只有Samsung.c里面当485片选型号。所以不存在被其他驱动复用的问题。

0

主题

7131

帖子

0

积分

发表于 2011-10-31 08:06:39 | 显示全部楼层
换一个gpio试试吧~

你先能控制电平,然后飞线接 一下你的485控制端~

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-31 09:20:40 | 显示全部楼层
试过了,换用GPG7飞线出来。把原来那根线割掉,结果一样。所以应该是驱动中什么地方提前调用了s3c24xx_serial_stop_tx()函数,请斑竹帮忙查一下。谢谢!

0

主题

7131

帖子

0

积分

发表于 2011-10-31 13:07:54 | 显示全部楼层
应用程序确定没有问题吗?

多打印点信息,dmesg看一下~

4

主题

38

帖子

54

积分

AM335x通行证

 楼主| 发表于 2011-10-31 16:30:33 | 显示全部楼层
应用程序没问题啦。我把串口换成串口二就能正常收发。只是换成485以后就不行了。多打印点信息是指什么,斑竹需要知道什么信息才能推断出问题的所在???????

0

主题

7131

帖子

0

积分

发表于 2011-10-31 16:49:57 | 显示全部楼层
在你应用还有驱动程序里,写个gpio驱动,查看gpio控制的状态,啥时候被更改了啊~

你这个问题,需要自己跟踪代码,还有电路了~

不好一下看出来啊~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-1-10 23:27

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表