st16c550的驱动的问题

我用的是s3c2410开发板+wince5.0。eINT13连接到16550的INT脚; kkj@!1q(wO  
fpga (xc9536)的14脚 ST16c550_CS 经过244转换后,作为st16c550的片选;在cpld的程序中assign ST16c550_CS = nGCS1; 6& hiW]Adm  
这样的话,相当于nGCS1作为片选,ST16c550的基地址该是0x0800_0000 这样理解不知道对不对? Do^yer~  
d4Y[}Fcp+  
=&qfmq  
1、在map.a(PLATFORM/SMDK2410/KERNEL/HAL/ARM/map.a)中找到了 vt5>>rl  
DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1 4K4u]"1  
这样platform.reg中 "IoBase"=dword:82000000 ;(是mmu后的虚地址,应该不是虚地址吧?) ^BI&-bR@  
--->根据大家的经验,这里是要写成物理地址"IoBase"=dword:08000000 对吧? 8 -b~p  
2、在cfw.c中(platform/smdk2410/kernel/hal/cfw.c)中 S=~+e{  
2.1 函数OEMInterruptEnable中添加 #}Ays#wA>?  
case SYSINTR_16550: (m.jC}J  
s2410IOP->rEINTPEND   = (1<<13); 7bJM $  
s2410IOP->rEINTMASK &= ~(1<<13); &N %-.&t'  
s2410INT->rSRCPND   = BIT_EINT8_23; /`O'eH  
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23; g|!=@9[dv  
s2410INT->rINTMSK   &= ~BIT_EINT8_23; xlW>3'uHfa  
RETAILMSG(1,(TEXT("::: SYSINTR_COM4   OEMInterruptEnable/r/n"))); uuCVI2|  
break; z]O>`50Q  
2.2 函数OEMInterruptDisable中添加: 2L1Azx  
case SYSINTR_16550: /z2d=E  
s2410INT->rINTMSK   |= BIT_EINT8_23; +!wkTrV  
s2410INT->rINTSUBMSK |= (1<<13); 1+Y;"tT  
break; v/wR) 9  
]JI A/|b6  
2.3 函数OEMInterruptDone中添加: aK9zw  
case SYSINTR_16550: f<3r;F7  
s2410INT->rINTMSK   &= ~BIT_EINT8_23; 2?owXcbx  
s2410IOP->rEINTMASK &= ~(1<<13); Qp>Q-+e0  
break; k8"[)lDc.  
3、在arminit.c中,已经添加了16550的代码,贴出如下 O<w7PS  
函数OEMInterruptHandler中 v_@&#!u`  
else if (IntPendVal == INTSRC_EINT8_23)// EINT8 ~ 23 '+C%]p  
{ j-etEWOTr  
// ............... jl4rEzVu  
if ( submask & (1 << 13)) L"!BN/i_  
{ .c.#V:XZ#U  
s2410IOP->rEINTMASK |= 0x2000; tI(co5 W  
s2410IOP->rEINTPEND = 0x2000; ^KMZB  
u5FlT3hY.  
s2410INT->rSRCPND = BIT_EINT8_23;     FeFH_  
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23; %fz!'C_4  
W7"ks(  
RETAILMSG(1, (TEXT("INT:SYSINTR_16550 INT........../r/n"))); NUH#  
return SYSINTR_16550; 6(}8[i:  
} 9YpD/H`  
// ................... OE/O:F:1j  
} d1#;>MiU  
igsJa1F  
4、最后说明一点,SYSINTR_16550是在PLATFORM/SMDK2410/inc/oalintr.h中定义的, $R7n1  
#define SYSINTR_16550   (SYSINTR_FIRMWARE+20) n-{G19?  
我直接用了。(开始还自己定义了一个#define SYSINTR_SERIAL4 (SYSINTR_FIRMWARE+24)后来发觉多余了,呵呵^_^) _}7N,Cx  
5、platform.reg中的代码: nj~1y ')  
;=========try to add st16c550 begin 2007-2-17============== )sVz;rF<  
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SERIAL4] 0Q=4{*:?  
  "DeviceArrayIndex" = dword:3 Z| Z447_  
  "SysIntr"=dword:24 ;SYSINTR_FIRMWARE+20 = 16 +20 = 36 =0x24 s3W)hU)  
"Irq"=dword:14   ;20 = 0x14 k#% BxT  
  ;"MemBase" = dword:08000000 {SW}S_  
  "IoBase" = dword:08000000 _YY:}'+  
  ;"MemLen" = dword:10 # &o3[.)9  
  "IoLen" = dword:2C qIa|sV/w0  
  "Prefix"="COM" ;GO>#yg4Eh  
  "Dll" = "Com16550.Dll" RZ9vQ/X U)  
  "Order"=dword:0 <SUjz}_Oa:  
  "Index"=dword:4 ] FvN*@lG  
  "Priority"=dword:0 r>sk@[4h  
  "Port"="COM4:" &C<B=T"I  
  "Tsp"="Unimodem.dll" 0n|op:]BHM  
"DeviceType"=dword:0 5zX;/n~  
"FriendlyName"="Serial Cable on COM4:" gX5I`mm  
"DeviceConfig"=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 wj9CL1Gx  
"IsrDll" = "isr16550.dll" 8MGtJ'.  
  "IsrHandler" = "ISRHandler" *<#jr  
  }x`W+r  
  RxY ;'NY  
;[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial4/Unimodem] x'@0]f.  
;   "Tsp"="Unimodem.dll" :2{6Pa(eg  
;   "DeviceType"=dword:0 @*e|{;X]hy  
; "FriendlyName"="Serial Cable on COM4:" /UTeaM!?"  
; "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 0m $f9b|Q?  
y{+$B Y$_  
2%i_SX[  
经过以上修改,build系统后,查看ce系统的注册表,active下有这个com4;打开串口成功,但是读写数据都不行。发送的时候,到writefile函数就死了,应该是没有返回;读取的时候应用程序倒是没有死掉,但是readfile返回读取的数据长度是0 z^$DXl@)h  
有可能是哪里的问题呢? DW&%"$2  
"{1`~pDj?  
另外,从输出的调试信息看,好像只是执行了OEMInterruptEnable ,其他的函数没有执行。

 

 

 

 

将GPG5配置成中断pin后,还是不行,现象一样; 4>C=:w  
另外贴出打印信息,请帮忙看一下 86F+N_>Z  
//=========com1(uart0) l:yAgm`  
<=SMILE=>+SerInit in ser2410_ser.c !bQ &n  
<=SMILE=>+Ser_GetRegistryData IN ser2410_ser.c;Try to open Drivers/Active/03 (kyo?3  
<=smile=>SerInit - DevIndex 0, IRQ 3, IOBase 50000000, IOLen 2C Y'0?<_ fj  
<=SMILE=>-Ser_GetRegistryData IN ser2410_ser.c aB6LAb2z;T  
<=smile=>+Ser_InternalMapRegisterAddresses : HalTranslateBusAddress in ser2410_ser.c E(+wl  
<=smile=>Ser_InternalMapRegisterAddresses : HalTranslateBusAddress - OK <?Izfl6  
<=smile=>Ser_InternalMapRegisterAddresses : ! IO Space ~LW%lMy;^|  
<=smile=>- Ser_InternalMapRegisterAddresses : ioPortBase=1310720 '=G Ce%A  
<=SMILE=>SerInit - ppBootArgs (1FFFFC) at 150FFC cBR8HkP~  
<=SMILE=>SerInit - pBootArgs (E1A07000) at 160000 4U;XqUY /  
<=SMILE=>SerInit - IRQ 3 = SYSINTR 19 'Qq_Xn8  
<=SMILE=>SerInit - Init 16550 data @&xaaqQ-  
SL_Init : IRDA = 0 =/QU$[7X(  
::: SER_VirtualAlloc() x`6^+>y^  
::: SER_VirtualAlloc() - Success H?(SSL  
+ S2410_SetIrDAIOP ZMMo6;  
S2410_SetIrDAIOP qM!f  
- S2410_SetIrDAIOP Z*9]:dG:!  
ClearPendingInts m_Ac/ct f  
<=SMILE=>SerInit - Disabling UART Power Xz .Y-5)  
SL_GetRxBufferSize t-7U1B}=<C  
<=smile=>COM1(uart0_) OEMInterruptEnable in cfw.c ZecvjbnVY  
<smile>INT:SYSINTR_serial(com1,uart0) INT in OEMInterruptHandler of armint.c.......... H1%[/X?=  
<=smile=>::: SYSINTR_COM1(uart0) OEMInterruptDone in cfw.c r2GK_$vd  
<smile>INT:SYSINTR_serial(com1,uart0) INT in OEMInterruptHandler of armint.c.......... }uI7 //S  
SL_PostInit A6NxM8ybn+  
ClearPendingInts 7{An@hNh  
//=========com4(16550扩展) ]KXMGH_  
<=smile=>+DllEntry in com_mdd2dbg ~3bZ+*H>  
<=smile=>serial port process attach x9)aBB  
<=smile=>-DllEntry function in com_mdd2dbg {+"g':><  
<=smile=> +COM_Init in mdd.c of com_mdd2debug ]dHB}  
<=smile=>Try to open Drivers/Active/06 &@% b?~  
<=smile=>DevIndex 3 ?L@@;tt  
<=smile=>About to call HWInit(Identifier=Drivers/Active/06,pSerialHead=0x39A50) @n7t?9Bx  
<=smile=>+CreateSerialObject in com16550.cpp. g5[D&  
<=smile=>+CPdd16550::Init in pdd16550.cpp of oo16550DBG. $T?*0"Mj[  
<=smile=>COM4(_SYSINTR_16550_) OEMInterruptEnable in cfw.c iW|s|1mh3  
<=smile=>-CreateSerialObject in com16550.cpp. Q !9HA[Ly  
<=smile=>Back from hardware init Ys-Keyg  
<=smile=>RxHead init'ed JbE?a[Eg?  
<=smile=>RxBuffer init'ed with start at 3a460 ^ <qrM  
<=smile=>+CPdd16550::PostInit in pdd16550.cpp of oo16550DBG. 1GtOA3,~;-  
<=smile=>ThreadStart()==> Start IST in pdd16550.cpp of oo16550DBG. ,>;!%Ui/p  
SL_GetInterruptType : 0xEF73BF5F, 0x692, 0x2002C00, 0x92, 0x0, 0x0 "JkZJ#  
<=smile=>-CPdd16550::PostInit in pdd16550.cpp of oo16550DBG. v&xKi>A il  
No interrupts pending, vector is useless (NX)o P  
<=smile=>-COM_Init >DL/ ..  
SL_GetInterruptType: INTR_NONE(pHWHead->bINT)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值