原创 续:基于i.MX27处理器串口扩展设计详解

2011-10-11 12:17 1309 8 8 分类: 消费电子

3.编写驱动程序

drivers/serial/8250.c就是8250兼容芯片的驱动程序,只需要根据硬件特性,修改该文件即可

 

1.在读取和设置寄存器的时候,根据串口编号来控制GPIO_CS4的输出,根据CPLD中预设的逻辑,当GPIO_CS4输出高电平的时候,片选选中串口1,输出低电平的时候,片选选中串口2,所以我们做出如下修改

static unsigned int serial_in(struct uart_8250_port *up, int offset)

{

        unsigned int tmp;

        unsigned long flags;

        unsigned int ret;

        int locked = spin_trylock_irqsave(&up->port.lock, flags);

        offset = map_8250_in_reg(up, offset) << up->port.regshift;

 

       

#if 1  

        if (up->port.line <= 1) {

                mxc_set_gpio_dataout(MX27_PIN_SSI1_CLK, (up->port.line == 0) ? 0 : 1);

        } else {

                printk(KERN_ERR "sc16c652 has just 2 port but line index is %d\n", up->port.line);

                if (locked) {

                        spin_unlock_irqrestore(&up->port.lock, flags);

                }

                return -EINVAL;

        }

#endif        

 }      

static void serial_out(struct uart_8250_port *up, int offset, int value)

{

        /* Save the offset before it's remapped */

        int save_offset = offset;

        unsigned long flags;

        int locked = spin_trylock_irqsave(&up->port.lock, flags);

        offset = map_8250_out_reg(up, offset) << up->port.regshift;

 

       

#if 1  

        if (up->port.line <= 1) {

                mxc_set_gpio_dataout(MX27_PIN_SSI1_CLK, up->port.line);

    } else {

                printk(KERN_ERR "sc16c652 has just 2 port but line index is %d\n", up->port.line);

                if (locked) {

                        spin_unlock_irqrestore(&up->port.lock, flags);

                }

                return;

        }

#endif 

   

 

}

在模块初始化函数中,最好在复位一下芯片

static int __init serial8250_init(void)

{

    mxc_set_gpio_dataout(MX27_PIN_SSI1_CLK, 0);

    mxc_set_gpio_dataout(MX27_PIN_SSI1_FS, 1);

    udelay(100);

    mxc_set_gpio_dataout(MX27_PIN_SSI1_FS, 0);

}

这样就完成了sc16c552的串口驱动,驱动加载成功后的设备文件名是 /dev/ttyS0 和 /dev/ttyS1,也可以通过修改udev的规则文件来修改设备文件名

 

驱动加载成功后,打印的调试信息如下

Serial: 8250/16550 driver $Revision: 1.1.1.1 $ 2 ports, IRQ sharing disabled

serial8250.0: ttyS0 at MMIO 0xd4000000 (irq = 150) is a ST16650V2

serial8250.0: ttyS1 at MMIO 0xd4000010 (irq = 149) is a ST16650V2

驱动侦测出来的设备类型是 ST16650V2,这个芯片和SC16C552是一样的

 

关于如何来调试 :

   进入控制台后,使用cat /proc/tty/driver/serial("serial"是8250默认的平台驱动名),看看IO地址,中断是否设置正常,如果有错就继续改改相关位置的代码即可。

 结束语

串口扩展在很多嵌入式处理器上都可以实现,在工业上使用串口需要大数据量,长时间的串口通信,不丢数据。

文章版权属于成都莱得科技有限责任公司所有,转载请注明出处。

网址:www.nidetech.com,联系电话:18080873876,技术交流QQ:1460879610  

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条