原创
在wince4.2下加载16C550串口驱动(转)
出自: http://www.cnemb.com/forum/read.php?tid=23015
在wince4.2下加载16C550串口驱动 7SA-OFM
系统是S3C2440,串口4是16C550外扩的,用于同GPRS通信。 G&%nF4
一.注册中断 \'It,PN
1、 在platform\\smdk2410\\inc\\Oalintr.h文件中添加 i)@U.-*5m
#define SYSINTR_SERIAL4 (SYSINTR_FIRMWARE+22)
(^tr}?C
同时注意修改MapIrq2SysIntr(DWORD _Irq)函数中_Irq判断条件,在我的系统中 eN<>#:`
if( _Irq<=23 ) nl)_`8=
>}dTO/?
//下面两处修改没有必要 =2.tu*!C
2、 在 platform\\smdk2410\\inc\\Oalintr.inc添加 `uIx/.L
SYSINTR_SERIAL4: .equ SYSINTR_FIRMWARE+22 |dl0B26x
?o(ZTlT
3、 在 platform\\smdk2410\\inc\\Oalintra.inc添加 *<`7|BH?3
SYSINTR_SERIAL4 EQU SYSINTR_FIRMWARE+22 N5q}::Odc
o9KyAP$2
二.修改注册表 x !#Ma
物理地址:10000000,使用nGCS2 cPA~eZbX
中断号0x16 = 22,物理中断Eint3 nwa\Lrh
;UART3 (physical COM4) (Serial) );Tx5Z}
IF BSP_NOSERIAL ! :[y]p7;{f
;=============== 16c552 COM4 (Serial) =============== $Nj'OJSj%
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SER24404] qg^(w fI
"DeviceArrayIndex"=dword:3 *hv=~A
$q
"Irq"=dword:16 7MKD_`g
"IoBase"=dword:10000000 NzjMk4t
"IoLen"=dword:8 ?"()>PJx
"Prefix"="COM" ]O6KKz
"Dll"="SER2440.Dll" aXRv}WO$>k
"Order"=dword:0 Gh2#-~|cB
"Index"=dword:4 VT'0DQ!NIq
"Priority"=dword:0 $8jaapNm@
"Port"="COM4:" 0('OyH)
"RegStride"=dword:1 Kp8fh-4_
"DeviceType"=dword:0 Po1hq2-U8
"FriendlyName"="Serial Cable on COM4:" zT$0xj8
"Tsp"="Unimodem.dll" _B}9f
"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 f(!E!\&n^
ENDIF BSP_NOSERIAL ! y7>iz6N
/CH(!\bQ
三.修改cfw.c itw{;j
1、OEMInterruptEnable()中: ;xhOj<:
case SYSINTR_SERIAL4: //16c552 Eint3 "2%>M
s2440INT->rSRCPND = BIT_EINT3; // to clear the previous pending states z9 O~W5-U
if (s2440INT->rINTPND & BIT_EINT3) vmvFBzLR
s2440INT->rINTPND = BIT_EINT3; #XcU{5Qm5
s2440INT->rINTMSK &= ~BIT_EINT3; O"\nR:\
break;
fSjs?zd`
+ZclGchw
2、OEMInterruptDisable()中 zFywC-my@
case SYSINTR_SERIAL4: 1+a@k
s2440INT->rINTMSK |= BIT_EINT3; p-,Iio+
break; S7CV
w,2
x#mtS-sw2Q
3、OEMInterruptDone()中 N
xFUO0O3
case SYSINTR_SERIAL4: 3 z=\.R
s2440INT->rINTMSK &= ~BIT_EINT3; Oc~aW3*A(
break; =!CU ?$g
^)0 9OV+hF
四.修改文件armint.c :6D0j
else if (IntPendVal == INTSRC_EINT3) // 16C552 int {cR=N~_EO
{ EnJ!mr
s2440INT->rINTMSK |= BIT_EINT3; +s~.A_7)
s2440INT->rSRCPND = BIT_EINT3; 6t7fa<
if (s2440INT->rINTPND & BIT_EINT3) s2440INT->rINTPND = BIT_EINT3; /M@PO"
//RETAILMSG(0,(TEXT("16C550 int generate\r\n"))); ($>XIb9f
return(SYSINTR_SERIAL4); Q7GY3X*kA
} pbLGe'
JJnYOau
五.修改2440_ser.c Cj^{9'0
添加如下函数,详细函数代码请看附件S2440_ser.c c!wtf,F
//for 16C552 c-8!#~M(
static SlaDt
PVOID B42sb_
Ser4Init( #/
?"+
ULONG Identifier, // @parm Device identifier. BX< dSK
PVOID pMddHead, // @parm First argument to mdd callbacks. L*]0"E
PHWOBJ pHWObj // @parm Pointer to our own HW OBJ for this device ax|1b`XUr"
) bx}fj#J]En
static `xz&Scil
BOOL + WDq=S
Ser4Open( #T3h}=
PVOID pHead /*@parm PVOID returned by Serinit. */ %y<]Yzv.
) f3tv3>p
BOOL )S@jDaU<
Ser4PowerOn( 5#2F1NX
PVOID pHead // @parm PVOID returned by SerInit. xWX*tJ4
) <7sIm^N
static (pR.Abq
BOOL BavO\{J#|0
Ser4EnableIR( 6Y384
PVOID pHead, // @parm PVOID returned by Serinit. *cv}*D
ULONG BaudRate // @parm PVOID returned by HWinit. ;/8?{N0
) v3RcwySk
static `
%?9=h%
BOOL /Z%>ArAx
Ser4DisableIR( ;y.E!
PVOID pHead /*@parm PVOID returned by Serinit. */ I$q>
) m7|RD]q&
static ;[0&G6g
BOOL i%{X9!*%TX
Ser4PowerOff( Y:QD
PVOID pHead // @parm PVOID returned by SerInit. 7^e +
) MXh
"Y*}
static Sfjje4R
BOOL
j2n,f7hl.
Ser4Deinit( Z@rN_WXx
PVOID pHead // @parm PVOID returned by SerInit. 7,$z;Lr0S
) yubSj*
static Yx?d X#3
ULONG IO$z%r7
Ser4Close( QL7>;t;
PVOID pHead // @parm PVOID returned by SerInit. =([av7
) gQWd&)'muf
static HRa@
VOID [Gr*,nVvB
Ser4GetCommProperties( BNGe
exs@
PVOID pHead, // @parm PVOID returned by SerInit. TW&DFKK`
LPCOMMPROP pCommProp // @parm Pointer to receive COMMPROP structure. 'C+;r?1!h
) !UBO_X%dz
BOOL TJ@Cj?y%
Ser4_GetRegistryData(PSER_16552_INFO pHWHead, LPCTSTR regKeyPath) w2gf&Lc\
3HV%4nZLf
L?wJ0
增加: R""%F#4XJ2
const CX/(o]
HW_VTBL Io16552VTbl4 = { H:&?ha,9
Ser4Init, P!g-X%ngo
SL_PostInitq, my\&hCE
Ser4Deinit, RNJFSD.
Ser4Open, 5a`%)K
Ser4Close, ".2K9j7$
SL_GetInterruptTypeq, &V=7D#?L
SL_RxIntrq, G$WOzY(
SL_TxIntrExq, Csst[3V
SL_OtherIntrq, 1JS2SxF
SL_LineIntrq, /I{R23o
SL_GetRxBufferSizeq, v"6 ?\=@
Ser4PowerOff, S'i;xL>
Ser4PowerOn, zQ)+/e(8
SL_ClearDTRq, Iin#Wd-/
SL_SetDTRq, QJX/7RA
SL_ClearRTSq, HCnf2td
SL_SetRTSq, e-6w8*!i
Ser4EnableIR, C8b''9t.
Ser4DisableIR, )iE"Tl
SL_ClearBreakq, \_ow9vU
SL_SetBreakq, " ~Q*XN2
SL_XmitComCharq, #uvJH8)D
SL_GetStatusq, 4O$2]D.\
SL_Resetq, 3)E(RyQA3
SL_GetModemStatusq, JeQ[qQ
Ser4GetCommProperties, ~<O,Vs_C/
SL_PurgeCommq, l)Mh2lA,=
SL_SetDCBq, SGf9U^ds
SL_SetCommTimeoutsq Jt=>-Spj
}; i?>Hr|
再增加: e-?6(F4
const HWOBJ Io16552Obj4 = { [j0w\{
THREAD_AT_INIT, U$J5r+>
SYSINTR_SERIAL4, SaNN;X0
(PHW_VTBL) &Io16552VTbl4 DTy/jaK
}; Wo3'd|Y~i
!R{em4?8D
修改GetSerialObject uBRw>"c_*8
PHWOBJ ZR
mPP
GetSerialObject( $jcz?vH
DWORD DeviceArrayIndex gMay
) iiN?\OO^~
{ T#N80BH[
PHWOBJ pSerObj; !PI0oh
B3.X}ys#
RETAILMSG(1,(TEXT("GetSerialObject%d\r\n"),DeviceArrayIndex)); Di])<V?
1O4D+0@
IRDA = DeviceArrayIndex; ++gPv}:$X
I*9Gb$]=
// Now return this structure to the MDD. 2X^iV09
if ( DeviceArrayIndex == 0 ) W
n6,U=$3
pSerObj = (PHWOBJ)(&IoObj); sB8p(
L
else if(DeviceArrayIndex == 1) Ho>p ^p
pSerObj = (PHWOBJ)(&IoObj2); 6\XP|n-0+0
else if(DeviceArrayIndex == 2) Px$'(eMj^3
pSerObj = (PHWOBJ)(&IoObj3); 5#P: "U
else if(DeviceArrayIndex == 3) [;Vi~$p|Eo
pSerObj = (PHWOBJ)(&Io16552Obj4); KqFmFcf|
else Qz'O{f
pSerObj = (PHWOBJ)(&IoObj); l
DgzM3
return (pSerObj); >Zi|$@7t-
} kVy"+ZebK
oC5gME"2
六.SOURCE文件 }o~Tw?z-|
修改2440串口驱动的SOURCE文件,添加ser16552.c,见附录。 :/ ~):tM
SOURCES= \ AviT+^7E?
ser2440_ser.c \ VG? yL2y
ser2440_hw.c \ ,oy4V?^B&
ser16552.c LPtx|Sx![
{6REfY
c
看源代码可以搞清楚整个流程,MDD也需要看一下,但不需要修改。 GA({r?i
在OEMInitInterrupts对Eint3中断进行设置, 上升沿触发 $u/8Rp
//gerryzhou add ____ Configure EINT3(GPF3) for 16c552 com4 interrupt. "a?2H8x
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3<<6)) | (0x2<<6); //GPF3==EINT3 9 ayH:;
s2440IOP->rGPFUP = (s2440IOP->rGPFUP | (0x1<<3)); // Disable pull-up. lk5_s@V
l
YB(#]H|8S
s2440IOP->rEXTINT0=(s2440IOP->rEXTINT0 & ~(0xf<<12)) |
(0x4<<12); // Rising edge triggered triggered.
文章评论(0条评论)
登录后参与讨论