2008년 10월 02일
s3c2440a uart 셋팅 하기
에구구 안녕하세요.
저두 초짜이지만 같은부분에서 고생 분들이 많이 있네요.
이곳에서의 자료를 정리 해보겠습니다.
CPU :s3c2440a
bsp : smdk2440 (자료실에 고맙게 있습니다. 검색+_+;;)(WINCE 5.0)
처음 으로 시작할때면 먼저 디버그포트 설정을 정하고 나머지를 어떻게 구현하는냐를 정하는것이 중요합니다.
제가 셋팅을 한것은
0번 : 디버그 포트
1번 : uart1 포트
2번 : uart2 입니다.
처음 으로 디거그 포트를 셋팅 하기 위새서는 어디루 가야 하냐 하면
\\SMDK2440A\Src\Kernel\Oal\debug.c 이파을을 수정 하시면 됩니다 .
OEMInitDebugSerial() 초기화 함수 이곳에 서 포트 를 셋팅 합니다 .
pIOPortReg = (S3C2440A_IOPORT_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
CLRREG32(&pIOPortReg->GPHCON, (3 << 4)|(3 << 6));
SETREG32(&pIOPortReg->GPHCON, (2 << 4)|(2 << 6));
SETREG32(&pIOPortReg->GPHUP, (1 << 2)|(1 << 3));
g_pUARTReg = (S3C2440A_UART_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_UART0, FALSE);
OUTREG32(&g_pUARTReg->UFCON, BSP_UART0_UFCON);
OUTREG32(&g_pUARTReg->UMCON, BSP_UART0_UMCON);
OUTREG32(&g_pUARTReg->ULCON, BSP_UART0_ULCON);
OUTREG32(&g_pUARTReg->UCON, BSP_UART0_UCON);
OUTREG32(&g_pUARTReg->UBRDIV, BSP_UART0_UBRDIV);
// 이부분을 자시의 의도되로 맞게 설정 하시면 디버그는 잘돌아 갑니다.
다음 uart1,2 설정 해보겠습니다.
위치는 다들 아실듯 합니다 .
SMDK2440A\Src\Drivers\Serial\ ser_smdk2440.cpp(아 힘들다 +_+;;)
수정할 부분 함수명
1. CreateSerialObject();
2. CPdd2440Serial1 내부에 Init()
3. CPdd2440Serial2 내부에 Init()
1. CreateSerialObject(); {
switch (DeviceArrayIndex) { //빨간색 중요 하다 ( 이것을 설정으로 uart 1,2 정해진다 ㅠㅠ 이거 몰라서 공생했다 ㅡㅡ)
case 0: // 각각은 레지스터에서 정해진다 .
pSerialPDD = new CPdd2440Serial1(lpActivePath,pMdd, pHwObj);
break;
case 1:
pSerialPDD = new CPdd2440Serial2(lpActivePath,pMdd, pHwObj);
break;
}
if (pSerialPDD && !pSerialPDD->Init()) {
delete pSerialPDD;
pSerialPDD = NULL;
}
}
이함수는 이정도 까 지 ㅡㅡ 나머지는 알아서 처리 하세여 (이함수에서만 입니다.)
2. CPdd2440Serial1 Init()
{
m_pDTRPort = (volatile ULONG *)&(m_pIOPregs->GPDDAT);
m_pDSRPort = (volatile ULONG *)&(m_pIOPregs->GPDDAT);
m_dwDTRPortNum = 0;
m_dwDSRPortNum = 1;
m_pDTRPort = (volatile ULONG *)&(m_pIOPregs->GPDDAT);
m_pDSRPort = (volatile ULONG *)&(m_pIOPregs->GPDDAT);
m_dwDTRPortNum = 0;
m_dwDSRPortNum = 1;
m_pIOPregs->GPHCON &= ~(0x3<<0 | 0x3<<2 | 0x3<<4 | 0x3<<6 );//tx,rx,rts,cts
m_pIOPregs->GPHCON |= (0x2<<0 | 0x2<<2 | 0x2<<4 | 0x2<<6 ); //자 셋팅 하고
m_pIOPregs->GPHCON |= (0x2<<0 | 0x2<<2); //마무리 하고
m_pIOPregs->GPHUP |= 0xf;
m_pIOPregs->GPDCON &= ~(0x3<<0 | 0x3<<2);//dtr,dsr 이것도 셋하고
m_pIOPregs->GPDCON |= (0x1<<0 | 0x0<<2);
m_pIOPregs->GPDUP |= 0x3;
}
이부분을 제어 가능 하다 -0- 485도 되겠네요 ^^ (DSR | dtr)
2. CPdd2440Serial2 Init()
CPdd2440Serial1 Init() 과 동일 하게 하시면 됩니다 . 하지만 dtr,dsr 은 연력 된분만 설정 하세요
그럼 이로서 준비는 된듯 합니다 ,
다음 으로 레지스터를 조금만 수정 하면 어느덧 마무리 단계가 보입니다.
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
"DeviceArrayIndex"=dword:0 // 이값에 의해 uart1,2로 나누어 지게 됩니다 .
"Irq"=dword:17 // datasheet 확인 하세여
"MemBase"=dword:50004000 // uart1 의 메모리
"InterruptBitsShift"=dword:3 ; UART 1 Interrupt Sub Register shift bit.
~~~~~~~~~~~~~`
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial2]
"DeviceArrayIndex"=dword:1
"Irq"=dword:f
"MemBase"=dword:50008000
"InterruptBitsShift"=dword:6 ; UART2 Interrupt Sub Register shift bit.
# by | 2008/10/02 11:51 | Wince | 트랙백 | 덧글(0)





