Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109320
  • 博文数量: 17
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-03 14:24
文章分类

全部博文(17)

文章存档

2011年(1)

2010年(16)

我的朋友

分类: LINUX

2010-07-14 21:25:22

1、参照网页《我在Linux-2.6.32.2下为ST16C554移植驱动的经历》编写 

      sc16c554四串口驱动;

   原文:http://blog.chinaunix.net/u3/116495/showart.php?id=2272834

 

2、出现问题:

(1)首次没有移植成功;是因为sc16c554芯片硬件上复位信号电平给弄反了,以致于编译通过后,虽然用cat /proc/tty/driver/serial命令也出现了四个串口,但是串口信息不对,全为UNKOWN设备。后放弃。

(2)遂自己编写驱动查找原因,编写了字符型设备来驱动16c554,发现片选、数据、和地址信号都有,就是没有中断,就查硬件设备三要素(电源、时钟、复位),后来发现设备复位电平不对,把芯片管脚翘起,收发正常。

(3)芯片正常后,仿照8250.c编写tty驱动,编写成功,linux2.6.13linux2.6.32.2上使用supervivinor flash上引导正常,但是用友善之臂提供的vboot引导出现问题,不成功。老是报内核地址为NULL,非法引用,然后就是一片寄存器值。看vboot源码没有找到问题所在,然后按照(1)的方法又进行二次移植。

(4)二次移植时,居然正常了,欣喜中。但很快发现数据发送不对,每次只能发送16个字节。问题出在

#define PORT(_base,_irq)                    \

{

        .mapbase = (unsigned long)_base,    \

        .irq                = _irq,         \

        .uartclk          = 16000000,       \

        .iotype           = UPIO_MEM32,     \

        .flags             = (UPF_BOOT_AUTOCONF | UPF_IOREMAP), \

        .regshift         = 0, \

}

 

iotype应为UPIO_MEM,即8位读写。

 

更改后即可。

(3)ttS3收发不对,使用cat /proc/tty/driver/serial命令查看时总是被识别为XScale设备和UNKOWN设备。后来发现是

       *((volatile unsigned int *)S3C2410_BWSCON) =

((*((volatile unsigned int *)S3C2410_BWSCON)) & ~(0x30333<<4))

                            | S3C2410_BWSCON_DW1_8

                            | S3C2410_BWSCON_DW2_8

                            | S3C2410_BWSCON_DW3_8

                            | S3C2410_BWSCON_DW4_8;

设置不对,应该为

       *((volatile unsigned int *)S3C2410_BWSCON) =

((*((volatile unsigned int *)S3C2410_BWSCON)) & ~(0x03333<<4))

                            | S3C2410_BWSCON_DW1_8

                            | S3C2410_BWSCON_DW2_8

                            | S3C2410_BWSCON_DW3_8

                            | S3C2410_BWSCON_DW4_8;

 

因为原作者用的CS1,CS2,CS3,CS5,我这里CS5变成了CS4,所以0x30333<<要变成0x03333

(5)驱动正常后,参照linux-2.6.32.2\drivers\serial\8250_exar_st16c554.c,又看了mach-mini2440.c的源文件,编写了8250_exar_sc16c554.c驱动(恢复了mach-mini2440.c8250.c中关于串口部分的原貌见附件),功能测试正常。

 

3、关于8250_exar_sc16c554.

 

硬件平台:s3c2440 自制印制板   

操作系统:linux-2.6.32.2

编 译 器:gcc-linux-arm 4.3.2

 

 

/*
 *  linux/drivers/serial/8250_exar_sc16c554.c
 *
 *  Written by Kou Jinqiao
 *  Based on 8250_exar_st16c554.c.
 *
 *  Copyright (C) 2010.07.07.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */


#include
#include
#include

#include
#include

 

#define PORT(_base,_irq)                    \
{       .iobase   = (unsigned long)_base,   \
        .mapbase  = (resource_size_t)_base, \
        .irq      = (unsigned int)_irq,     \
        .irqflags = IRQF_TRIGGER_RISING,    \
        .uartclk  = 16000000,        \
        .iotype   = UPIO_MEM,     \
        .flags    = (UPF_BOOT_AUTOCONF | UPF_IOREMAP), \
        .regshift = 0, \
}

 


static struct plat_serial8250_port exar_data[] = {
       PORT(S3C2410_CS1 + 0x0, IRQ_EINT0),
       PORT(S3C2410_CS2 + 0x0, IRQ_EINT1),
       PORT(S3C2410_CS3 + 0x0, IRQ_EINT2),
       PORT(S3C2410_CS4 + 0x0, IRQ_EINT3),
       { },
};

 

static struct platform_device exar_device = {
 .name   = "serial8250",
 .id   = PLAT8250_DEV_EXAR_ST16C554,
 .dev   = {
  .platform_data = exar_data,
 },
};

 

static int __init exar_init(void)
{
/* Set the 8bit bus width of bank1,bank2,bank3,bank4*/
       *((volatile unsigned int *)S3C2410_BWSCON) =
((*((volatile unsigned int *)S3C2410_BWSCON)) & ~(0x03333<<4))
                            | S3C2410_BWSCON_DW1_8
                            | S3C2410_BWSCON_DW2_8
                            | S3C2410_BWSCON_DW3_8
                            | S3C2410_BWSCON_DW4_8;
                           
 return platform_device_register(&exar_device);
}

module_init(exar_init);

MODULE_AUTHOR("Kou Jinqiao");
MODULE_DESCRIPTION("8250 serial probe module for Exar cards-sc16c554");
MODULE_LICENSE("GPL");

 

 

8250_exar_sc16c554.c放入linux/drivers/serial/下,修改Makefile文件,重新make menuconfig 选中8250_exar_sc16c554,然后make zImage即可。

阅读(7202) | 评论(4) | 转发(1) |
给主人留下些什么吧!~~

hrbeuguojun2015-03-19 16:01:28

楼主,附件去哪儿了?

cjyoung2011-02-28 18:15:34

Kou Jinqiao,你好!请问附件在什么地方呢?

chinaunix网友2010-09-07 15:46:53

Kou Jinqiao,你好!想问一下,如果4个通道都用CS5片选,寄存器地址分别为: 2800_0000~2800_0007, .... 2800_0018~2800_001F PORT(S3C2410_CS1 + 0x0, IRQ_EINT0), PORT(S3C2410_CS2 + 0x0, IRQ_EINT1), PORT(S3C2410_CS3 + 0x0, IRQ_EINT2), PORT(S3C2410_CS4 + 0x0, IRQ_EINT3), 此处的偏移地址如何确定?还请多指教

xqzhao2062010-08-24 16:03:05

博主,您好,看了您的贴很受益。 请教一下您sc16c554的地址和2410的地址是如何连接的?我现在的连接是sc16c554的A0对2410的LADDR1然后类推,不知道这样有没有问题,还请指教,谢谢!