免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4738 | 回复: 8
打印 上一主题 下一主题

移植16550 UART驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-28 13:15 |只看该作者 |倒序浏览
求教:公司自己做的板子,处理器MPC5200,扩展16550 UART(不做console),Kernel 2.6.16,之前未加载该驱动时启动正常,加载后在"Freeing unused kernel memory: 100k"挂住了。因板子与Freescale公司的lite5200b基本类似,我在arch/ppc/platform/lite5200b.c定义了以下结构(感觉在哪定义都行):
static struct plat_serial8250_port serial8250_ports[] = {

[0] = {
.uartclk = 9600*16,
.iotype = UPIO_MEM,
.mapbase = 0xfc000000,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
.irq = MPC52xx_IRQ1,
},
[1] = {
.uartclk = 9600*16,,
.iotype = UPIO_MEM,
.mapbase = 0xfc000008,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
.irq = MPC52xx_IRQ1,
},
[2] = {
.uartclk =  9600*16,,
.iotype = UPIO_MEM,
.mapbase = 0xfc000010,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
.irq = MPC52xx_IRQ2,
},
[3] = {
.uartclk =  9600*16,,
.iotype = UPIO_MEM,
.mapbase = 0xfc000018,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
.irq = MPC52xx_IRQ2,
},
[4] = {
.uartclk =  9600*16,,
.iotype = UPIO_MEM,
.mapbase = 0xfc000020,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
.irq = MPC52xx_IRQ3,
},
[5] = {
.uartclk =  9600*16,,
.iotype = UPIO_MEM,
.mapbase = 0xfc000028,
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ,
.irq = MPC52xx_IRQ3,
},
{},
};

static struct platform_device serial8250_device = {
.name = "serial8250",
.id = 0,
.dev.platform_data = serial8250_ports,
};

static int __init
add_serial8250_devices(void)
{
return platform_device_register(&serial8250_device);
}

arch_initcall(add_serial8250_devices);

启动信息如下
The boot message is :
FT-Boot 1.2.0 (Sep 17 2008 - 09:16:55)

CPU:   MPC5200 v2.2, Core v1.4 at 462 MHz
       Bus 132 MHz, IPB 132 MHz, PCI 33 MHz
Board: FXALM(mpc52xx)
I2C:   85 kHz, ready
DRAM:  256 MB
FLASH: (Bank#1 - 512 kB, Bank#2 - 16 MB) 16.5 MB
In:    serial
Out:   serial
Err:   serial
Net:   FEC ETHERNET
IDE:   Bus 0: OK
  Device 0: Model: 128MB  ATA Flash Disk Firm: ADAA408J Ser#: A161112339F000831558
            Type: Hard Disk
            Capacity: 122.1 MB = 0.1 GB (250112 x 512)
Hit any key to stop autoboot:  0
Using FEC ETHERNET device
TFTP from server 192.168.1.40; our IP address is 192.168.1.50
Filename '/tftpboot/uImage'.
Load address: 0x200000
Loading: #################################################################
         #################################################################
         #################################################################
         ########################################################
done
Bytes transferred = 1281939 (138f93 hex)
## Booting image at 00200000 ...
   Image Name:   Linux-2.6.16
   Created:      2008-11-19  19:22:59 UTC
   Image Type:   PowerPC Linux Kernel Image (gzip compressed)
   Data Size:    1281875 Bytes =  1.2 MB
   Load Address: 00000000
   Entry Point:  00000000
   Uncompressing Kernel Image ... OK
id mach(): done
MMU:enter
MMU:hw init
MMU:mapin
MMU:setio
MMU:exit
setup_arch: enter
setup_arch: bootmem
arch: exit
bootinfo is find_bootinfo()<5>Linux version 2.6.16 (root@...) (gcc version 3.4.3) #50 Thu No8
Built 1 zonelists
Kernel command line: console=ttyPSC0,9600 root=/dev/nfs rw nfsroot=192.168.1.40:/home/hyz/ltib-mpc5200-20070201
PID hash table entries: 2048 (order: 11, 32768 bytes)
Console: colour dummy device 80x25
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 256896k available (1968k kernel code, 664k data, 100k init, 0k highmem)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
            
DMA: MPC52xx BestComm driver
MPC52xx BestComm inited
SCSI subsystem initialized
Installing knfsd (copyright (C) 1996 okir@...).
JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
Serial: 8250/16550 driver $Revision: 1.90 $ 6 ports, IRQ sharing enabled
serial8250.0: ttyS0 at MMIO 0xfc000000 (irq = 6) is a 16550A
serial8250.0: ttyS1 at MMIO 0xfc000008 (irq = 6) is a 16550A
serial8250.0: ttyS2 at MMIO 0xfc000010 (irq = 7) is a 16550A
serial8250.0: ttyS3 at MMIO 0xfc000018 (irq = 7) is a 16550A
serial8250.0: ttyS4 at MMIO 0xfc000020 (irq = is a 16550A
serial8250.0: ttyS5 at MMIO 0xfc000028 (irq = is a 16550A
Serial: MPC52xx PSC driver
ttyPSC0 at MMIO 0xf0002000 (irq = 40) is a MPC52xx PSC
ttyPSC1 at MMIO 0xf0002200 (irq = 41) is a MPC52xx PSC
ttyPSC2 at MMIO 0xf0002400 (irq = 42) is a MPC52xx PSC
ttyPSC3 at MMIO 0xf0002600 (irq = 50) is a MPC52xx PSC
ttyPSC4 at MMIO 0xf0002800 (irq = 51) is a MPC52xx PSC
ttyPSC5 at MMIO 0xf0002c00 (irq = 43) is a MPC52xx PSC
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
ide: MPC52xx IDE/ATA driver
eth0: Phy @ 0x0, type LXT971 (0x001378e2)
hda: 128MB ATA Flash Disk, ATA DISK drive
ide0 at 0xf0003a60-0xf0003a67,0xf0003a5c on irq 46
mpc52xx-ide: Setup successful for ide0 (mem=f0003a00-f0003aff irq=46)
hda: max request size: 128KiB
hda: 250112 sectors (128 MB) w/1KiB Cache, CHS=977/8/32
hda: cache flushes not supported
hda: hda1
flash chip on the Lite5200/Lite5200B: Found 1 x16 devices at 0x0 in 8-bit bank
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
cfi_cmdset_0001: Erase suspend on write enabled
Creating 1 MTD partitions on "flash chip on the Lite5200/Lite5200B":
0x00000000-0x01000000 : "Filesystem"
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
IP route cache hash table entries: 4096 (order: 2, 16384 bytes)
TCP established hash table entries: 16384 (order: 4, 65536 bytes)
TCP bind hash table entries: 16384 (order: 4, 65536 bytes)
TCP: Hash tables configured (established 16384 bind 16384)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
eth0: config: auto-negotiation on, 100HDX, 10HDX.
IP-Config: Complete:
      device=eth0, addr=192.168.1.50, mask=255.255.255.0, gw=192.168.1.1,
     host=192.168.1.50, domain=, nis-domain=(none),
     bootserver=192.168.1.40, rootserver=192.168.1.40, rootpath=
Looking up port of RPC 100003/2 on 192.168.1.40
Looking up port of RPC 100005/1 on 192.168.1.40
VFS: Mounted root (nfs filesystem).
Freeing unused kernel memory: 100k init

就停在这里了,我什么地方做错了?驱动8250.c文件有要修改的地方吗?

[ 本帖最后由 youngchul 于 2008-11-28 13:18 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-05 20:58 |只看该作者
从你的信息来看,是不是通过PCI来扩展的?

貌似你的16550已经驱动起来

找找其他方面的原因

论坛徽章:
0
3 [报告]
发表于 2008-12-07 19:56 |只看该作者

回复 #2 myforever 的帖子

不是PCI的,跟踪了一下代码,发现进不了中断处理函数,不设置中断,轮询也一样挂死

论坛徽章:
0
4 [报告]
发表于 2008-12-08 21:41 |只看该作者
原帖由 youngchul 于 2008-12-7 19:56 发表
不是PCI的,跟踪了一下代码,发现进不了中断处理函数,不设置中断,轮询也一样挂死

serial8250.0: ttyS0 at MMIO 0xfc000000 (irq = 6) is a 16550A
serial8250.0: ttyS1 at MMIO 0xfc000008 (irq = 6) is a 16550A
serial8250.0: ttyS2 at MMIO 0xfc000010 (irq = 7) is a 16550A
serial8250.0: ttyS3 at MMIO 0xfc000018 (irq = 7) is a 16550A



不是PCI的,那中断为什么共享呢?

只有PCI的中断才可以共享吧

论坛徽章:
0
5 [报告]
发表于 2008-12-17 16:59 |只看该作者

回复 #4 myforever 的帖子

中断都是可以设置共享的,轮询通过了,中断怎么搞呢?

论坛徽章:
5
6 [报告]
发表于 2008-12-19 17:20 |只看该作者
原帖由 youngchul 于 2008-12-17 16:59 发表
中断都是可以设置共享的,轮询通过了,中断怎么搞呢?


request_irq的参数是可以设置中断共享方式

轮询方式和中断方式没有太大区别, 写好ISR并正确注册中断, 就行

论坛徽章:
0
7 [报告]
发表于 2008-12-19 19:25 |只看该作者

中断共享

中断冲突的概念几乎是 PC 体系的同义词. 过去, 在 PC 上的 IRQ 线不能服务多于一个设备, 并且它们从不足够. 结果, 失望的用户花费大量时间开着它们的计算机, 尽力找到一个方法来使它们所有的外设一起工作.

现代的硬件, 当然, 已经设计来允许中断共享; PCI 总线要求它. 因此, Linux 内核支持在所有总线上中断共享, 甚至是那些(例如 ISA 总线)传统上不被支持的. 2.6 内核的设备驱动应当编写来使用共享中断, 如果目标硬件能够支持这个操作模式. 幸运的是, 使用共享中断在大部分时间是容易的.

共享中断通过 request_irq 来安装就像不共享的一样, 但是有 2 个不同:

SA_SHIRQ 位必须在 flags 参数中指定, 当请求中断时.

dev_id 参数必须是独特的. 任何模块地址空间的指针都行, 但是 dev_id 明确地不能设置为 NULL.

内核保持着一个与中断相关联的共享处理者列表, 并且 dev_id 可认为是区别它们的签名. 如果 2 个驱动要在同一个中断上注册 NULL 作为它们的签名, 在卸载时事情可能就乱了, 在中断到的时候引发内核 oops. 由于这个理由, 如果在注册共享中断时传给了一个 NULL dev_id , 现代内核会大声抱怨. 当请求一个共享的中断, request_irq 成功, 如果下列之一是真:

中断线空闲.

所有这条线的已经注册的处理者也指定共享这个 IRQ.

无论何时 2 个或多个驱动在共享中断线, 并且硬件中断在这条线上中断处理器, 内核为这个中断调用每个注册的处理者, 传递它的 dev_id 给每个. 因此, 一个共享的处理者必须能够识别它自己的中断并且应当快速退出当它自己的设备没有被中断时. 确认返回 IRQ_NONE 无论何时你的处理者被调用并且发现设备没被中断.

如果你需要探测你的设备, 在请求 IRQ 线之前, 内核无法帮你. 没有探测函数可给共享处理者使用. 标准的探测机制有效如果使用的线是空闲的, 但是如果这条线已经被另一个有共享能力的驱动持有, 探测失败, 即便你的驱动已正常工作. 幸运的是, 大部分设计为中断共享的硬件能够告知处理器它在使用哪个中断, 因此减少明显的探测的需要.

释放处理者以正常方式进行, 使用 free_irq. 这里 dev_id 参数用来从这个中断的共享处理者列表中选择正确的处理者来释放. 这就是为什么 dev_id 指针必须是独特的.

一个使用共享处理者的驱动需要小心多一件事: 它不能使用 enable_irq 或者 disable_irq. 如果它用了, 对其他共享这条线的设备就乱了; 禁止另一个设备的中断即便短时间也可能产生延时, 这对这个设备和它的用户是有问题的. 通常, 程序员必须记住, 他的驱动不拥有这个 IRQ, 并且它的行为应当比它拥有这个中断线更加"社会性".

论坛徽章:
5
8 [报告]
发表于 2008-12-24 23:51 |只看该作者
原帖由 myforever 于 2008-12-19 19:25 发表
通常, 程序员必须记住, 他的驱动不拥有这个 IRQ, 并且它的行为应当比它拥有这个中断线更加"社会性"


共享中断方式时,ISR必须马上检测本次中断是否属于自己的。否,就立即退出ISR。

论坛徽章:
0
9 [报告]
发表于 2008-12-25 08:09 |只看该作者
原帖由 yidou 于 2008-12-24 23:51 发表


共享中断方式时,ISR必须马上检测本次中断是否属于自己的。否,就立即退出ISR。



呵呵,解析得很清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP