Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63348
  • 博文数量: 28
  • 博客积分: 230
  • 博客等级: 二等列兵
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-01 09:44
文章分类

全部博文(28)

文章存档

2016年(1)

2015年(2)

2014年(11)

2013年(7)

2012年(7)

我的朋友

分类: LINUX

2012-11-06 13:31:25

       还是手里这块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正常,没什么问题

点击(此处)折叠或打开

  1. 02:0a.1 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 0 (rev 01) (prog-if 02 [16550])
  2. Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
  3. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  4. Interrupt: pin B routed to IRQ 19
  5. Region 0: I/O ports at e070 [size=8]
  6. Region 1: Memory at d014a000 (32-bit, non-prefetchable) [size=16]
  7. Capabilities:
  8. 02:0a.2 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 1 (prog-if 02 [16550])
  9. Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
  10. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  11. Interrupt: pin B routed to IRQ 19
  12. Region 0: I/O ports at e060 [size=8]
  13. Region 1: Memory at d0149000 (32-bit, non-prefetchable) [size=16]
  14. Capabilities:
  15. 02:0a.3 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 2 (prog-if 02 [16550])
  16. Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
  17. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  18. Interrupt: pin B routed to IRQ 19
  19. Region 0: I/O ports at e050 [size=8]
  20. Region 1: Memory at d0148000 (32-bit, non-prefetchable) [size=16]
  21. Capabilities:
  22. 02:0a.4 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 3 (prog-if 02 [16550])
  23. Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
  24. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  25. Interrupt: pin B routed to IRQ 19
  26. Region 0: I/O ports at e040 [size=8]
  27. Region 1: Memory at d0147000 (32-bit, non-prefetchable) [size=16]
  28. Capabilities:

查看dmesg:                 dmesg | grep serial  

点击(此处)折叠或打开

  1. [ 1.804377] serial 0000:02:0a.1: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  2. [ 1.804462] serial 0000:02:0a.1: PCI INT B disabled
  3. [ 1.804505] serial 0000:02:0a.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  4. [ 1.804581] serial 0000:02:0a.2: PCI INT B disabled
  5. [ 1.804617] serial 0000:02:0a.3: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  6. [ 1.804692] serial 0000:02:0a.3: PCI INT B disabled
  7. [ 1.804727] serial 0000:02:0a.4: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  8. [ 1.804803] serial 0000:02:0a.4: PCI INT B disabled
从dmesg输出来看,系统没有识别出串口。

sudo apt-get install setserial
查看串口信息:         setserial -g /dev/ttyS0: 可以明确没有识别串口类型

点击(此处)折叠或打开

  1. /dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
  2. /dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3
  3. /dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
  4. /dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
  5. /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 :

点击(此处)折叠或打开

  1. 02:0a.1 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 0 (rev 01) (prog-if 02 [16550])
  2. Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
  3. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  4. Latency: 0
  5. Interrupt: pin B routed to IRQ 44
  6. Region 0: I/O ports at e070 [size=8]
  7. Region 1: Memory at d014a000 (32-bit, non-prefetchable) [size=16]
  8. Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
  9. Address: fee0300c Data: 4179
  10. Capabilities: [50] Power Management version 2
  11. Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
  12. Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
  13. Kernel driver in use: pch_uart
  14. 02:0a.2 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 1 (prog-if 02 [16550])
  15. Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
  16. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  17. Latency: 0
  18. Interrupt: pin B routed to IRQ 45
  19. Region 0: I/O ports at e060 [size=8]
  20. Region 1: Memory at d0149000 (32-bit, non-prefetchable) [size=16]
  21. Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
  22. Address: fee0300c Data: 4181
  23. Capabilities: [50] Power Management version 2
  24. Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
  25. Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
  26. Kernel driver in use: pch_uart
  27. 02:0a.3 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 2 (prog-if 02 [16550])
  28. Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
  29. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  30. Latency: 0
  31. Interrupt: pin B routed to IRQ 46
  32. Region 0: I/O ports at e050 [size=8]
  33. Region 1: Memory at d0148000 (32-bit, non-prefetchable) [size=16]
  34. Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
  35. Address: fee0300c Data: 4189
  36. Capabilities: [50] Power Management version 2
  37. Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
  38. Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
  39. Kernel driver in use: pch_uart
  40. 02:0a.4 Serial controller: Intel Corporation Platform Controller Hub EG20T UART Controller 3 (prog-if 02 [16550])
  41. Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
  42. Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
  43. Latency: 0
  44. Interrupt: pin B routed to IRQ 47
  45. Region 0: I/O ports at e040 [size=8]
  46. Region 1: Memory at d0147000 (32-bit, non-prefetchable) [size=16]
  47. Capabilities: [40] MSI: Enable+ Count=1/1 Maskable- 64bit-
  48. Address: fee0300c Data: 4191
  49. Capabilities: [50] Power Management version 2
  50. Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
  51. Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
  52. Kernel driver in use: pch_uart
dmesg :

点击(此处)折叠或打开

  1. [ 113.504815] pch_uart 0000:02:0a.1: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  2. [ 113.505014] pch_uart 0000:02:0a.1: irq 44 for MSI/MSI-X
  3. [ 113.505074] pch_uart 0000:02:0a.1: setting latency timer to 64
  4. [ 113.505203] 0000:02:0a.1: ttyPCH0 at I/O 0xe070 (irq = 44) is a pch_uart
  5. [ 113.524129] pch_uart 0000:02:0a.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  6. [ 113.524231] pch_uart 0000:02:0a.2: irq 45 for MSI/MSI-X
  7. [ 113.524262] pch_uart 0000:02:0a.2: setting latency timer to 64
  8. [ 113.524322] 0000:02:0a.2: ttyPCH1 at I/O 0xe060 (irq = 45) is a pch_uart
  9. [ 113.536123] pch_uart 0000:02:0a.3: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  10. [ 113.536228] pch_uart 0000:02:0a.3: irq 46 for MSI/MSI-X
  11. [ 113.536260] pch_uart 0000:02:0a.3: setting latency timer to 64
  12. [ 113.536323] 0000:02:0a.3: ttyPCH2 at I/O 0xe050 (irq = 46) is a pch_uart
  13. [ 113.560136] pch_uart 0000:02:0a.4: PCI INT B -> GSI 19 (level, low) -> IRQ 19
  14. [ 113.560248] pch_uart 0000:02:0a.4: irq 47 for MSI/MSI-X
  15. [ 113.560281] pch_uart 0000:02:0a.4: setting latency timer to 64
  16. [ 113.560358] 0000:02:0a.4: ttyPCH3 at I/O 0xe040 (irq = 47) is a pch_uart

sudo setserial -g /dev/ttyPCH* 

点击(此处)折叠或打开

  1. /dev/ttyPCH0, UART: undefined, Port: 0xe070, IRQ: 44
  2. /dev/ttyPCH1, UART: undefined, Port: 0xe060, IRQ: 45
  3. /dev/ttyPCH2, UART: undefined, Port: 0xe050, IRQ: 46
  4. /dev/ttyPCH3, UART: undefined, Port: 0xe040, IRQ: 47
sudo cat /proc/tty/pch_uart :

点击(此处)折叠或打开

  1. serinfo:1.0 driver revision:
  2. 0: uart:pch_uart port:0000E070 irq:44 tx:0 rx:0
  3. 1: uart:pch_uart port:0000E060 irq:45 tx:0 rx:0
  4. 2: uart:pch_uart port:0000E050 irq:46 tx:0 rx:0
  5. 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文件:
   点击(此处)折叠或打开
  1. #如果已定义KERNELRELEASE,则说明是从内核构造系统调用的,
  2. #因此可以利用其内建语句
  3. ifneq ($(KERNELRELEASE),)
  4. obj-m := pch_uart.o
  5. #否则,是直接从命令行调用的
  6. #这时要调用内核构造系统
  7. else
  8. KERNELDIR ?= /lib/modules/$(shell uname -r)/build
  9. PWD := $(shell pwd)
  10. default:
  11. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  12. @echo 'OK'
  13. 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.




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