8111|25

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

扩展串口芯片驱动的问题 [复制链接]

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

最新回复

搞了几天,我的可以了,发现和硬件关系不是很大,修改不多。注意PXA270 的自带串口驱动 ,多多借鉴。  详情 回复 发表于 2010-5-6 08:33
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

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

嘿嘿就是根绝那个改的。网上很多例子了。good luck
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

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

回复

72

帖子

0

TA的资源

一粒金砂(初级)

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


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

总线扩展与原来的的三个串口只是PDD层不同,到流驱动的MDD基本可以认为一样吧。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

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

WinCE中串口驱动及接口函数介绍
http://blog.eeworld.net/nanjianhui/archive/2008/07/09/2627755.aspx
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 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
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 kyzf 的回复:

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

WinCE中串口驱动及接口函数介绍
http://blog.eeworld.net/nanjianhui/archive/2008/07/09/2627755.aspx
多谢,这个学习了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
移植public 下的吧
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 ztg328 的回复:

移植public 下的吧
现在是按原来16550下移植的,寄存器的配置方面,16c554和16550基本上一致。FIFO方面还没弄太明白,没有大改,现在出了问题是驱动编译没问题,就是一直加载失败,还找不到原因。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
基本可以参照2440的串口驱动来做,因为本人只对2440的比较熟悉,呵呵,原理一样的。
看看你扩展的中断是否是外部中断。注册表部分改改,驱动部分主要就是三个方面,一个是初始化,一个是发送处理,一个是接收处理。
本人做过VK3224的扩展串口,这个芯片实在烂,一开始我也是想按PDD架构做的,发现很难实现,串口之间造成冲突,只能实现一个口。后来就采用简单流驱动解决了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 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
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

12
 
如果只是数据的收发,做一个简单的流接口驱动就可以了
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
楼主干脆直接写个单层的流驱动得了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 xilidecai 的回复:

如果只是数据的收发,做一个简单的流接口驱动就可以了
也就是数据的收发,不过做得完善一点以后也会用到。现在发现加载不上的问题了,是用的中断IRQ定义的位置与申请IRQ对应的地址出现了错误。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

15
 
感谢大家,终于有进展了,现在发送可以了,不过发送大于16个字节的话,它是分了两次发,在电脑端串口调试助手能明显看到分成了两行,但数据没有丢失。
现在出了新的问题,接收不到,用示波器测得,发送时硬件中断是有的,但接收时没有收到硬件中断,这个可能是有哪里没有配置吗?中断应该没错了,发送都正常。不知道为什么接收没有产生硬件中断?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

16
 
接收的中断没有产生,结果处理函数也没法执行,导致接收某个数据的时候,中断被拉高,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.
请大家帮忙看下
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

17
 
有可能是flow control的問題~
你先把預設32 bytes FIFO interrupt
改1byte就中斷~
要是可以 再去看看是不是DCB參數
關於RTS_CONTROL_HANDSHAKE 跟RTS_CONTROL_ENABLE的問題
之前我有遇過上述的情況
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 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,这样测得接收的中断还是没有产生
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

19
 
就是设成了1byte也没又产生中断,但是读lsr的话,data ready位是置位的,另外ier的设置,bit0是置位了的,这一位是fifo中使能接收数据有效中断和超时中断的。不明白还有什么地方可以影响到中断的产生。
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

20
 
引用 18 楼 waterdream0820 的回复:
就是设成了1byte也没又产生中断,但是读lsr的话,data ready位是置位的,另外ier的设置,bit0是置位了的,这一位是fifo中使能接收数据有效中断和超时中断的。不明白还有什么地方可以影响到中断的产生。


我以前老的4.2 的驱动修改过来的,现在我换成楼主标准5.0 的也出现类似的问题,调试了两天,无果,楼主一起努力。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表