还是手里这块PC 板卡,ubuntu12.04操作系统,cpu 是intel的Atom E680,控制芯片是intel EG20T,遇到的问题是,我们需要的4个串口都是从EG20T出的,但是实际上串口都有问题不能通信。
测试串口:
A:
1 串口2、3引脚互联
2 cat < /dev/ttyS0
3 另启一个终端(Ctr+Alt+F2)echo "hello" > /dev/ttyS0
发现输出hello之后没有回显,则断定串口有问题。
B:
另外安装了minicom :
sudo apt-get install minicom
使用minicom -b 9600 -D /dev/ttyS0 测试也没有任何反映。
查看pci设备: lspci -vv 说明pci正常,没什么问题
- 02:0a.1 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 0 (rev 01) (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Interrupt: pin B routed to IRQ 19
- Region 0: I/O ports at e070 [size=8]
- Region 1: Memory at d014a000 (32-bit, non-prefetchable) [size=16]
- Capabilities:
- 02:0a.2 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 1 (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Interrupt: pin B routed to IRQ 19
- Region 0: I/O ports at e060 [size=8]
- Region 1: Memory at d0149000 (32-bit, non-prefetchable) [size=16]
- Capabilities:
- 02:0a.3 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 2 (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Interrupt: pin B routed to IRQ 19
- Region 0: I/O ports at e050 [size=8]
- Region 1: Memory at d0148000 (32-bit, non-prefetchable) [size=16]
- Capabilities:
- 02:0a.4 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 3 (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Interrupt: pin B routed to IRQ 19
- Region 0: I/O ports at e040 [size=8]
- Region 1: Memory at d0147000 (32-bit, non-prefetchable) [size=16]
- Capabilities:
查看dmesg: dmesg | grep serial
- [ 1.804377] serial 0000:02:0a.1: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 1.804462] serial 0000:02:0a.1: PCI INT B disabled
- [ 1.804505] serial 0000:02:0a.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 1.804581] serial 0000:02:0a.2: PCI INT B disabled
- [ 1.804617] serial 0000:02:0a.3: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 1.804692] serial 0000:02:0a.3: PCI INT B disabled
- [ 1.804727] serial 0000:02:0a.4: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 1.804803] serial 0000:02:0a.4: PCI INT B disabled
从dmesg输出来看,系统没有识别出串口。
sudo apt-get install setserial
查看串口信息: setserial -g /dev/ttyS0: 可以明确没有识别串口类型
- /dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
- /dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3
- /dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
- /dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
- /dev/ttyS4, UART: unknown, Port: 0x0000, IRQ: 0
sudo cat /proc/tty/driver/serial也显示这个串口 unknown.
查看串口信息不正常,port /uart type /irq等都与pci配置中显示的不一致,因此判断有可能是驱动问题。
使用setserial 设置串口,参数,使之与PCI配置信息一致:
sudo setserial /dev/ttyS0 uart 16550A port 0xe070 irq 19
再查看信息如下:
sudo setserial -g /dev/ttyS0
/dev/ttyS0, UART: 16550A, Port:0xe070, IRQ: 19, Flags: low_latency
都设置OK后再试一下,还是不行。
估计一定是驱动的问题了,lsmod 发现没有pch_uart,难道是pch_uart的驱动没有加入内核么?又见曙光了!
马上重启系统后,手动加载驱动试一下:sudo modprobe pch_uart
lsmod查看发现这次驱动加载成功了哦,呵呵,立马去查看相关串口信息:
我们在/dev/下发现多了几个文件:
ttyPCH0
ttyPCH1
ttyPCH2
ttyPCH3
lspci -vv :
- 02:0a.1 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 0 (rev 01) (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Latency: 0
- Interrupt: pin B routed to IRQ 44
- Region 0: I/O ports at e070 [size=8]
- Region 1: Memory at d014a000 (32-bit, non-prefetchable) [size=16]
- Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
- Address: fee0300c Data: 4179
- Capabilities: [50] Power Management version 2
- Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
- Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
- Kernel driver in use: pch_uart
- 02:0a.2 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 1 (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Latency: 0
- Interrupt: pin B routed to IRQ 45
- Region 0: I/O ports at e060 [size=8]
- Region 1: Memory at d0149000 (32-bit, non-prefetchable) [size=16]
- Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
- Address: fee0300c Data: 4181
- Capabilities: [50] Power Management version 2
- Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
- Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
- Kernel driver in use: pch_uart
- 02:0a.3 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 2 (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Latency: 0
- Interrupt: pin B routed to IRQ 46
- Region 0: I/O ports at e050 [size=8]
- Region 1: Memory at d0148000 (32-bit, non-prefetchable) [size=16]
- Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
- Address: fee0300c Data: 4189
- Capabilities: [50] Power Management version 2
- Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
- Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
- Kernel driver in use: pch_uart
- 02:0a.4 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 3 (prog-if 02 [16550])
- Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Latency: 0
- Interrupt: pin B routed to IRQ 47
- Region 0: I/O ports at e040 [size=8]
- Region 1: Memory at d0147000 (32-bit, non-prefetchable) [size=16]
- Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
- Address: fee0300c Data: 4191
- Capabilities: [50] Power Management version 2
- Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
- Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
- Kernel driver in use: pch_uart
dmesg :
- [ 113.504815] pch_uart 0000:02:0a.1: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 113.505014] pch_uart 0000:02:0a.1: irq 44 for MSI/MSI-X
- [ 113.505074] pch_uart 0000:02:0a.1: setting latency timer to 64
- [ 113.505203] 0000:02:0a.1: ttyPCH0 at I/O 0xe070 (irq = 44) is a pch_uart
- [ 113.524129] pch_uart 0000:02:0a.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 113.524231] pch_uart 0000:02:0a.2: irq 45 for MSI/MSI-X
- [ 113.524262] pch_uart 0000:02:0a.2: setting latency timer to 64
- [ 113.524322] 0000:02:0a.2: ttyPCH1 at I/O 0xe060 (irq = 45) is a pch_uart
- [ 113.536123] pch_uart 0000:02:0a.3: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 113.536228] pch_uart 0000:02:0a.3: irq 46 for MSI/MSI-X
- [ 113.536260] pch_uart 0000:02:0a.3: setting latency timer to 64
- [ 113.536323] 0000:02:0a.3: ttyPCH2 at I/O 0xe050 (irq = 46) is a pch_uart
- [ 113.560136] pch_uart 0000:02:0a.4: PCI INT B -> GSI 19 (level, low) -> IRQ 19
- [ 113.560248] pch_uart 0000:02:0a.4: irq 47 for MSI/MSI-X
- [ 113.560281] pch_uart 0000:02:0a.4: setting latency timer to 64
- [ 113.560358] 0000:02:0a.4: ttyPCH3 at I/O 0xe040 (irq = 47) is a pch_uart
sudo setserial -g /dev/ttyPCH*
- /dev/ttyPCH0, UART: undefined, Port: 0xe070, IRQ: 44
- /dev/ttyPCH1, UART: undefined, Port: 0xe060, IRQ: 45
- /dev/ttyPCH2, UART: undefined, Port: 0xe050, IRQ: 46
- /dev/ttyPCH3, UART: undefined, Port: 0xe040, IRQ: 47
sudo cat /proc/tty/pch_uart :
- serinfo:1.0 driver revision:
- 0: uart:pch_uart port:0000E070 irq:44 tx:0 rx:0
- 1: uart:pch_uart port:0000E060 irq:45 tx:0 rx:0
- 2: uart:pch_uart port:0000E050 irq:46 tx:0 rx:0
- 3: uart:pch_uart port:0000E040 irq:47 tx:0 rx:0
一切看起来都OK的,由于没有加载pch_dma模块,因此uart应该工作在低功耗模式:
sudo setserial /dev/ttyPCH0 low_latency
再试一下串口吧, :) 可惜的是我的串口依然不能用,我真的要骂娘了哦!
明明linux 3.2 内核中已经有了EG20T的驱动了,怎么还是不行呢?
实在没有办法了,看到网上兄弟们都是用的2.6.35 版本内核然后打上patch的方法解决的,我也只好这样办了。
更新ubuntu版本到10.04版本的内核,安装之后才发现内核版本是2.6.32 ,没办法啊,安装系统太麻烦了,只好下一个2.6.35版本的内核,然后再打patch,编译内核了。
如果是ubuntu10.10版本,那么内核本身就是2.6.35 的,就不需要重新编译内核了,只需要手动编译一下pch_uart模块就好了,操作如下:
手动编译内核模块的方法:
因为我看了一下pch_uart.patch,就是在内核代码中增加了一个文件 pch_uart.c,因此将该patch 打入内核后,将pch_uart.c拷贝出来,放到一个单独目录中:
mkdir ~/uart
进入内核源码目录: cd /usr/src/linux-2.6.35
patch -p1
cp driver/tty/serial/pch_uart.c ~/uart
cd ~/uart
在uart 目录中添加 Makefile文件:
点击(此处)折叠或打开
- #如果已定义KERNELRELEASE,则说明是从内核构造系统调用的,
- #因此可以利用其内建语句
- ifneq ($(KERNELRELEASE),)
- obj-m := pch_uart.o
- #否则,是直接从命令行调用的
- #这时要调用内核构造系统
- else
- KERNELDIR ?= /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- default:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- @echo 'OK'
- endif
执行sudo make 就可以编译生成pch_uart.ko模块,最后insmod pch_uart.ko加载该模块。就可以了。
可惜的是我糊里糊涂装的系统是ubuntu10.04,内核是2.6.32的,只好重新编译内核了。
由于已经两年多没有搞过这些东西了,到网上去再学习了下,看了下ubuntu/debian编译内核和普通的版本好像有些区别,看了下,也没搞清楚怎么编译。都说debian的方式简单,我觉得挺糊涂的,诶,不所了,如果需要参照debian/ubuntu的方式编译内核,可以参考下面网站:
我参考的是这个经典的老方法编译内核:
1 下载内核:
下载linux 2.6.35内核到 /usr/src目录,解压内核源码 tar jxvf linux-image-2.6.35.tar.bz2 (我就是这样下载的代码编译的)下载地址:
另外一种下载源代码的方式是(估计这种方式下载的代码ubuntu有过修改,用这种方法下载的代码,应该用ubuntu的方法进行编译):
sudo apt-cache search linux-image-2.6.35*
找到一个合适的image 版本,下载其源代码
sudo apt-get source linux-image-2.6.35
也可以用这个命令来下载当前版本内核源代码:
note: 也可以用这个命令下载内核源码:sudo apt-get install linux-source 会自动安装当前版本内核的源代码到 /usr/src
2 安装编译内核需要的工具:
sudo apt-get install fakeroot kernel-wedge build-essential makedumpfile kernel-package
cd /usr/src/linux-2.6.31.6
3 下面就可以来进行配置了:
cp /boot/config-2.6.32* .config
如果需要用make menuconfig 配置的话需要下载下面的库:
sudo apt-cache search ncurses
sudo apt-get install libncurses5
如果用 make xconfig 的话需要安装QT开发包。
配置时我把pch_uart选为m ,意即编译为模块,手动加载。
4 下面就是编译步骤了:
开始编译内核了哦: 参考网站上的执行顺序是:
make
make bzImage
make modules_install
我的执行顺序是(我想应该没什么影响吧):
make bzImage
make modules
make modules_install
5 将bzImage复制至/boot下:
cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.35
6 将System.map复制至/boot下:
cp System.map /boot/System.map-2.6.35
7 生成initrd.img:
cd /lib/modules/2.6.31.6
sudo mkinitramfs 2.6.35 -o /boot/initrd.img-2.6.35
注意,红色的字体2.6.35(内核目录)一定要有,如果空着的话,会按照当前系统内核版本的目录为默认值。
8 最后就是更新启动引导:自动查找新Ubuntu内核,并添加至grub引导:
sudo update-grub
这部分也可以手动添加完成,我的ubuntu10.04使用的 grub2引导的:
直接在其中添加一个menuentry即可。
重新启动,进入 ~/uart目录:sudo modprobe pch_uart 再试下串口,这下串口有了回显。一切OK了,不过这次并没有生成ttyPCH0 1 2 3等文件,串口文件依然是 ttyS0 1 2 3.
阅读(1263) | 评论(0) | 转发(0) |