扩展串口芯片驱动的问题

userchen   2010-3-17 13:54 楼主
PXA270+WinCE6.0  通过总线扩展串口 芯片 ST16c554 扩出了4个串口
对串口了解不够,请问一下,写扩展串口的驱动需要注意哪些?
对比芯片资料发现里面寄存器的配置与16550差别不大,是不是可以继承16550的pdd层?
mdd层需要修改吗,还是要单独取出来?

回复评论 (25)

差别不大。只是一些FIFo大小不一致吧。

嘿嘿就是根绝那个改的。网上很多例子了。good luck
点赞  2010-3-17 13:56
引用: 引用楼主 waterdream0820 的回复:
PXA270+WinCE6.0  通过总线扩展串口 芯片 ST16c554 扩出了4个串口
对串口了解不够,请问一下,写扩展串口的驱动需要注意哪些?
对比芯片资料发现里面寄存器的配置与16550差别不大,是不是可以继承16550的pdd层?
mdd层需要修改吗,还是要单独取出来?
谢谢,我找了很久了,没发现270下的例子,找到的2440下的还不是wince的。主要是不太清楚总线扩展的与原来的那三个串口的区别,是不是时序什么的也有问题。
点赞  2010-3-17 14:27
引用: 引用楼主 waterdream0820 的回复:
PXA270+WinCE6.0 通过总线扩展串口 芯片 ST16c554 扩出了4个串口
对串口了解不够,请问一下,写扩展串口的驱动需要注意哪些?
对比芯片资料发现里面寄存器的配置与16550差别不大,是不是可以继承16550的pdd层?
mdd层需要修改吗,还是要单独取出来?


楼主完全可以比对下16C550与16C554的硬件与通讯控制区别,
针对性小修改下16550的pdd层,就可以啦。

总线扩展与原来的的三个串口只是PDD层不同,到流驱动的MDD基本可以认为一样吧。
点赞  2010-3-17 14:55
楼主还是去看看牛人ARM-WinCE的一片文章:

WinCE中串口驱动及接口函数介绍
http://blog.eeworld.net/nanjianhui/archive/2008/07/09/2627755.aspx
点赞  2010-3-17 15:01
引用: 引用 3 楼 kyzf 的回复:

引用楼主 waterdream0820 的回复:
PXA270+WinCE6.0 通过总线扩展串口 芯片 ST16c554 扩出了4个串口
对串口了解不够,请问一下,写扩展串口的驱动需要注意哪些?
对比芯片资料发现里面寄存器的配置与16550差别不大,是不是可以继承16550的pdd层?
mdd层需要修改吗,还是要单独取出来?


楼主完全可以比对下16C550与16C554的硬件……
谢谢,大家有什么建议都提啊。
有关注册表项,原来的如下
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial2]
   "Irq"=dword:14             ; 20 IRQ_STUART
   "SysIntr"=dword:1B           ; 27 SYSINTR_STUART
   "MemBase"=dword:40700000   ; STUART Register
   "MemLen"=dword:40
   "DeviceArrayIndex"=dword:82  ; STUART object
   "Prefix"="COM"
   "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
   "Dll"="ms2_serial.dll"
   "Order"=dword:0
后四个串口,如果引用相同的类,可以用同样的DeviceArrayIndex吗?
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial4]
   "Irq"=dword:22                ; 34 IRQ_UART4
   "SysIntr"=dword:20           ; 32 SYSINTR_UART4
   "MemBase"=dword:04001000   ; EXUART Register
   "MemLen"=dword:40
   "DeviceArrayIndex"=dword:84  ;  
   "Prefix"="COM"  
   "Dll"="ms2_exserial.dll"
   "Order"=dword:0
点赞  2010-3-17 15:09
引用: 引用 4 楼 kyzf 的回复:

楼主还是去看看牛人ARM-WinCE的一片文章:

WinCE中串口驱动及接口函数介绍
http://blog.eeworld.net/nanjianhui/archive/2008/07/09/2627755.aspx
多谢,这个学习了
点赞  2010-3-17 15:19
移植public 下的吧
点赞  2010-3-18 23:16
引用: 引用 7 楼 ztg328 的回复:

移植public 下的吧
现在是按原来16550下移植的,寄存器的配置方面,16c554和16550基本上一致。FIFO方面还没弄太明白,没有大改,现在出了问题是驱动编译没问题,就是一直加载失败,还找不到原因。
点赞  2010-3-22 16:30
基本可以参照2440的串口驱动来做,因为本人只对2440的比较熟悉,呵呵,原理一样的。
看看你扩展的中断是否是外部中断。注册表部分改改,驱动部分主要就是三个方面,一个是初始化,一个是发送处理,一个是接收处理。
本人做过VK3224的扩展串口,这个芯片实在烂,一开始我也是想按PDD架构做的,发现很难实现,串口之间造成冲突,只能实现一个口。后来就采用简单流驱动解决了
点赞  2010-3-23 09:52
引用: 引用 9 楼 g00glelin 的回复:

基本可以参照2440的串口驱动来做,因为本人只对2440的比较熟悉,呵呵,原理一样的。
看看你扩展的中断是否是外部中断。注册表部分改改,驱动部分主要就是三个方面,一个是初始化,一个是发送处理,一个是接收处理。
本人做过VK3224的扩展串口,这个芯片实在烂,一开始我也是想按PDD架构做的,发现很难实现,串口之间造成冲突,只能实现一个口。后来就采用简单流驱动解决了
多谢,我是用的外部中断,现在就是加载不了,于是加调试信息,发现问题如下
DeviceFolder::LoadDevice(Drivers\\BuiltIn\\Serial) last 30 TicksDEVICE!RegReadActivationValues RegQueryValueEx(Drivers\\BuiltIn\\Serial2\\BusPrefix) returned 2
DEVICE!RegReadActivationValues RegQueryValueEx(Notify\\BusPrefix) returned 2
--主要是下面,扩展了4个串口,4,5,6,7
DeviceFolder::LoadDevice(Drivers\\BuiltIn\\Serial2) last 30 TicksDEVICE!RegReadActivationValues RegQueryValueEx(Drivers\\BuiltIn\\Serial4\\BusPrefix) returned 2
ms_exsrial a init !--这是在最外层加的打印信息
CPdd16554  init ! -- 这是继承了Cpdd16550类的,开始初始化
CPdd16554  init ist set up!--这是建立完ist后的打印信息
--CPdd16550::Init()== TRUE 这个地方就出错了,没有初始化对
--注册表信息如下
--[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial4]
   "Irq"=dword:22             ; 34 IRQ_AUART
   "SysIntr"=dword:20           ; 32 SYSINTR_AUART
   "MemBase"=dword:04001000   ; AUART Register
   "MemLen"=dword:40
   "DeviceArrayIndex"=dword:3  ; AUART object
   "Prefix"="COM"
   "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
   "Dll"="ms2_exserial.dll"
   "Order"=dword:0

--[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial4\Unimodem]
   "Tsp"="Unimodem.dll"
   "DeviceType"=dword:0
   "FriendlyName"="Serial Cable on COM4:"
   "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
--下面还是接着的打印信息
ms_exsrial a init false!
udevice.exe $udevice_0003
FSDMGR!MountTable_t::RegisterVolumeName: Registered "$udevice_0003" at index 8APISCreateAPIHandle: pvData == NULL
FSDMGR!MountTable_t::RegisterVolume: Registered volume at index 8 (Name="$udevice_0003", MountFlags=0x101)Unknown: DEBUGCHK failed in file C:\\ymzki\\public\\COMMON\\oak\\drivers\\serial\\serpddcm\\.\\cserpdd.cpp at line 531
DEBUG_BREAK @c1036400 Ignored.
DEVICE!LaunchDevice: Init() failed for device 0xd00e60d0
DEVICE!I_ActivateDeviceEx: couldn't activate: prefix COM, index 3, dll ms2_exserial.dll, context 0xd23ae684
DeviceFolder::LoadDevice(Drivers\\BuiltIn\\Serial4) last 112 TicksDEVICE!RegReadActivationValues RegQueryValueEx(Drivers\\BuiltIn\\Serial5\\BusPrefix) returned 2
ms_exsrial b init !
CPdd16554  init !
CPdd16554  init ist set up!
ms_exsrial b init false!

[NOTIFY] Module loaded
[NOTIFY] Initializing.
DB:OpenDB fail: DB DB_notify_queue not found
[NOTIFY] Initialization completed successfully
[NOTIFY] ProcessDatabase::started at local time 02/19/2006 12:14:50
[NOTIFY] HandleSystemEvent 7 /ADD COM1:
[NOTIFY] HandleSystemEvent 7 /ADD COM2:
[NOTIFY] HandleSystemEvent 7 /ADD NFY0:
Unknown: DEBUGCHK failed in file C:\\ymzki\\public\\COMMON\\oak\\drivers\\serial\\serpddcm\\.\\cserpdd.cpp at line 531
DEBUG_BREAK @c1036400 Ignored.
DEVICE!LaunchDevice: Init() failed for device 0xd00e6270
DEVICE!I_ActivateDeviceEx: couldn't activate: prefix COM, index 3, dll ms2_exserial.dll, context 0xd23ae684
点赞  2010-3-23 10:37
如果只是数据的收发,做一个简单的流接口驱动就可以了
点赞  2010-3-24 08:24
楼主干脆直接写个单层的流驱动得了。
点赞  2010-3-24 08:51
引用: 引用 11 楼 xilidecai 的回复:

如果只是数据的收发,做一个简单的流接口驱动就可以了
也就是数据的收发,不过做得完善一点以后也会用到。现在发现加载不上的问题了,是用的中断IRQ定义的位置与申请IRQ对应的地址出现了错误。
点赞  2010-3-24 14:59
感谢大家,终于有进展了,现在发送可以了,不过发送大于16个字节的话,它是分了两次发,在电脑端串口调试助手能明显看到分成了两行,但数据没有丢失。
现在出了新的问题,接收不到,用示波器测得,发送时硬件中断是有的,但接收时没有收到硬件中断,这个可能是有哪里没有配置吗?中断应该没错了,发送都正常。不知道为什么接收没有产生硬件中断?
点赞  2010-3-25 13:56
接收的中断没有产生,结果处理函数也没法执行,导致接收某个数据的时候,中断被拉高,lsr=0x61,第0位表示data ready,这一位没处理,然后发送端也产生不了中断,但是发送正常。不过接收的中断问什么没产生呢,还是不明白。初始化接收的时候寄存器的值如下
16554 lsr:         60        THREmpty TXEmpty
16554 rbr/thr:        00
16554 IER:         0D        RXData RXErr ModemStatus
16554 iir:         C1       
16554 lcr:         03        8BPC
16554 msr:         F0         CTSDSR RI DCD

m_pReg16550->Write_FCR((m_pReg16550->Read_FCR() & ~SERIAL_IIR_FIFOS_ENABLED) | SERIAL_FCR_RCVR_RESET | SERIAL_FCR_ENABLE | (uWarterMarkBit & SERIAL_IIR_FIFOS_ENABLED ));
----(把触发层级设为了04)Write_FCR(0x43)      
m_pReg16550->Write_IER(m_pReg16550->Read_IER() | SERIAL_IER_RDA);
---Write_IER(0xD)               
m_pReg16550->Read_LSR(); // Clean Line Interrupt.
请大家帮忙看下
点赞  2010-3-29 17:16
有可能是flow control的問題~
你先把預設32 bytes FIFO interrupt
改1byte就中斷~
要是可以 再去看看是不是DCB參數
關於RTS_CONTROL_HANDSHAKE 跟RTS_CONTROL_ENABLE的問題
之前我有遇過上述的情況
点赞  2010-3-29 19:32
引用: 引用 16 楼 ccuair 的回复:

有可能是flow control的問題~
你先把預設32 bytes FIFO interrupt
改1byte就中斷~
要是可以 再去看看是不是DCB參數
關於RTS_CONTROL_HANDSHAKE 跟RTS_CONTROL_ENABLE的問題
之前我有遇過上述的情況
"你先把預設32 bytes FIFO interrupt"指的是 ST16554_FIFO_DEPTH 1 吧,原来用的16.另外trigger level 也改成01,这样测得接收的中断还是没有产生
点赞  2010-3-30 08:48
就是设成了1byte也没又产生中断,但是读lsr的话,data ready位是置位的,另外ier的设置,bit0是置位了的,这一位是fifo中使能接收数据有效中断和超时中断的。不明白还有什么地方可以影响到中断的产生。
点赞  2010-3-30 14:21
引用: 引用 18 楼 waterdream0820 的回复:
就是设成了1byte也没又产生中断,但是读lsr的话,data ready位是置位的,另外ier的设置,bit0是置位了的,这一位是fifo中使能接收数据有效中断和超时中断的。不明白还有什么地方可以影响到中断的产生。


我以前老的4.2 的驱动修改过来的,现在我换成楼主标准5.0 的也出现类似的问题,调试了两天,无果,楼主一起努力。
点赞  2010-3-30 21:53
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复