7710 cut 3.1 을 기준으로 UART 통신을 하기 위한 방법을 설명한다. 7710 에 들어오면서 S/W 수정이 필요하기 때문에 잘 읽어보기 바란다.
들어가기 전에
본격적인 설명에 들어가기 전에, 내가 경험(?)했던 상황을 그대로 설명하는 것이 문서의 내용을 이해하는 데, 좀더 도움이 되리라 생각한다.
7710 cut 2.1 의 경우에는 uart 를 제외하고 다른 디바이스들은 테스트를 해봤다. uart 의 경우에는 몇번의 삽질을 끝에 7710 cut 2.1 의 bug list 를 보고, 이 것은 칩 버그라고 생각했다. 그러던 중에 이번에 조립한 7710 cut 3.1 에서 uart 테스트를 해봤다.
결과는 마찬가지였다. 문서를 작성하고 있는 지금은 uart 문제를 해결한 상태이다. 몇가지 문제점들이 있었는 데, 이제부터 본격적으로 이것들에 대해 설명하겠다.
문제는 총 3 가지로 요약할 수 있다.
- 회로 납땜 문제
- 7710M6minus.zip(7710ref-SNAP2005.10.071-DVB.zip) 문제
- 라이브러리 문제
참고로 실험환경은 다음 표와 같다.
H/W | 7710 cut 3.1 2 대 |
S/W | 7710M6minus.zip(7710ref-?SNAP2005.10.071-DVB.zip), DACS7000.zip |
비고 | 7710M6minus.zip 은 7710 cut 3.1 에 대응되는 버전. DACS7000.zip 은 7710 cut 2.1 에 대응되는 버전(H/W 테스트하는 루틴 추가) |
7710M6minus.zip 은 'A' 로, DACS7000.zip 은 'B' 라고 칭하겠다.
회로 납땜 문제
다른 타겟보드도 마찬가지이겠지만, 가장 먼저 CPU 와 메모리를 납땜후에 테스트한다. 그 후에 주변 디바이스를 테스트한다. uart 를 테스트를 하기 위해, 7710 회로도(2005.04)의 8 PAGE 왼쪽 상단에 있는 회로를 납땜했다. 그리고 나서 'A','B' 를 돌려서 테스트 했다. 하지만, 모두 제대로 된 통신을 하지 못했다.
회로도에서 'U801' 의 전원(VCC)을 스코프로 찍어 보니, 5V 전압이 나오지 않았다. 회로도 상에서 나와있는 A_5V 라고 하는 전압은 회로도 7 PAGE 의 왼쪽 상단에 있는 회로에 의해서 공급되는 전압이다. 바로 이 곳을 납땜하지 않은 것이다!!
이 회로를 납땜 후, 스코프로 다시 확인해보니 5V 전압이 나왔다.
7710M6minus.zip(7710ref-SNAP2005.10.071-DVB.zip) 문제
앞의 문제를 해결한 후에 'A','B' 를 돌려서 테스트 했지만, 결과는 마찬가지 였다. 몇가지 프로그램 수정이 필요하다. 여기서는 testapp1 을 기준으로 테스트 했다.
7710ref 의 세팅은 uart 를 사용하지 않게 되어있기 때문에, 환경 설정을 수정해주어야 한다.
7710ref/bin/setup.bat
rem set TESTAPP_SWITCH_HD_MODES=1 rem If this variable is set, HD format will be periodically switched between 1080I, 720P & 480P in testapp1 rem Otherwise, output will be set to TESTAPP_HD_FORMAT format rem set DVD_APPLIC=TESTTOOL rem set DVD_REF=%STi7710ROOT%/testapps/testapp1 set DVD_IO=UART <<<------- 추가!!! goto Done echo This setup.bat file must be edited to reflect the installation location echo in order to work. Please read the instructions in the setup.bat file. echo This script is being run as: echo %0% :Done
7710ref/testapps/shared/7710/uart.h
#define ASC_0_TXD_BIT PIO_BIT_0 #define ASC_0_RXD_BIT PIO_BIT_1 #define ASC_0_TXD_DEV PIO_DEVICE_0 #define ASC_0_RXD_DEV PIO_DEVICE_0 #define ASC_0_RTS_BIT PIO_BIT_NOT_USED #define ASC_0_CTS_BIT PIO_BIT_NOT_USED #define ASC_0_RTS_DEV PIO_DEVICE_NOT_USED #define ASC_0_CTS_DEV PIO_DEVICE_NOT_USED #define ASC_1_TXD_BIT PIO_BIT_0 #define ASC_1_RXD_BIT PIO_BIT_1 #define ASC_1_TXD_DEV PIO_DEVICE_1 #define ASC_1_RXD_DEV PIO_DEVICE_1 #define ASC_1_RTS_BIT PIO_BIT_4 #define ASC_1_CTS_BIT PIO_BIT_5 #define ASC_1_RTS_DEV PIO_DEVICE_1 #define ASC_1_CTS_DEV PIO_DEVICE_1 #define ASC_2_TXD_BIT PIO_BIT_4 /// 수정한 부분 !!! #define ASC_2_RXD_BIT PIO_BIT_3 /// 수정한 부분 !!! #define ASC_2_TXD_DEV PIO_DEVICE_4 #define ASC_2_RXD_DEV PIO_DEVICE_4 #define ASC_2_RTS_BIT PIO_BIT_2 #define ASC_2_CTS_BIT PIO_BIT_3 #define ASC_2_RTS_DEV PIO_DEVICE_NOT_USED #define ASC_2_CTS_DEV PIO_DEVICE_NOT_USED #define ASC_3_TXD_BIT PIO_BIT_0 #define ASC_3_RXD_BIT PIO_BIT_1 #define ASC_3_TXD_DEV PIO_DEVICE_5 #define ASC_3_RXD_DEV PIO_DEVICE_5 #define ASC_3_RTS_BIT PIO_BIT_3 #define ASC_3_CTS_BIT PIO_BIT_2 #define ASC_3_RTS_DEV PIO_DEVICE_5 #define ASC_3_CTS_DEV PIO_DEVICE_5
위에서 수정한 부분을 이해하려면, 7710 데이터 시트(P.36 ~ 39) 를 보아야 한다. 현재 회로도에서 uart 는 PIO 4 에 연결되어 있으므로 BIT 3,4 를 사용해야 한다. 그래서 위와 같이 수정해주어야 한다.
7710ref/testapps/shared/7710/uart.c
ST_ErrorCode_t UART_Setup( void) { ST_ErrorCode_t ST_ErrorCode = ST_NO_ERROR; STUART_Params_t UartDefaultParams; memset((void *)&UartInitParams, 0, sizeof(STUART_InitParams_t)); memset((void *)&UartDefaultParams, 0, sizeof(STUART_Params_t)); /* Setup clock info */ (void)ST_GetClockInfo(&ST_ClockInfo); /* Global setup of uart init. params */ /* Zero port definitions */ UartInitParams.RXD.PortName[0] = '\0'; UartInitParams.TXD.PortName[0] = '\0'; UartInitParams.RTS.PortName[0] = '\0'; UartInitParams.CTS.PortName[0] = '\0'; UartDefaultParams.RxMode.DataBits = STUART_8BITS_NO_PARITY; // NO PARITY 에 인것에 주의할 것!!! UartDefaultParams.RxMode.StopBits = STUART_STOP_1_0; UartDefaultParams.RxMode.FlowControl = STUART_NO_FLOW_CONTROL; UartDefaultParams.RxMode.BaudRate = 115200; UartDefaultParams.RxMode.NotifyFunction = NULL; UartDefaultParams.RxMode.TermString = NULL; UartDefaultParams.RxMode.TimeOut = 1; /* As short as possible */ UartDefaultParams.TxMode.DataBits = STUART_8BITS_NO_PARITY; UartDefaultParams.TxMode.StopBits = STUART_STOP_1_0; UartDefaultParams.TxMode.FlowControl = UartDefaultParams.RxMode.FlowControl; UartDefaultParams.TxMode.BaudRate = 115200; UartDefaultParams.TxMode.TermString = NULL; UartDefaultParams.TxMode.TimeOut = 0; /* No time-out */ UartDefaultParams.TxMode.NotifyFunction = NULL; UartDefaultParams.SmartCardModeEnabled = FALSE; UartDefaultParams.GuardTime = 0; UartDefaultParams.NACKSignalDisabled = FALSE; /* Not used, only for smartcard */ UartDefaultParams.HWFifoDisabled = FALSE; /* Not used, only for smartcard */ UartInitParams.UARTType = ASC_DEVICE_TYPE; UartInitParams.DriverPartition = (ST_Partition_t *)system_partition; UartInitParams.BaseAddress = (U32 *)ASC_2_BASE_ADDRESS; // 수정할 것 UartInitParams.InterruptNumber = ASC_2_INTERRUPT; // 수정할 것 UartInitParams.InterruptLevel = ASC_2_INTERRUPT_LEVEL; // 수정할 것 UartInitParams.ClockFrequency = ST_ClockInfo.CommsBlock; UartInitParams.SwFIFOEnable = TRUE; UartInitParams.FIFOLength = 256; strcpy(UartInitParams.RXD.PortName, PIO_GET_DEVICENAME(ASC_2_RXD_DEV)); // 수정할 것 UartInitParams.RXD.BitMask = ASC_2_RXD_BIT; // 수정할 것 strcpy(UartInitParams.TXD.PortName, PIO_GET_DEVICENAME(ASC_2_TXD_DEV)); // 수정할 것 UartInitParams.TXD.BitMask = ASC_2_TXD_BIT; // 수정할 것 strcpy(UartInitParams.RTS.PortName, PIO_GET_DEVICENAME(ASC_2_RTS_DEV)); // 수정할 것 UartInitParams.RTS.BitMask = ASC_2_RTS_BIT; // 수정할 것 strcpy(UartInitParams.CTS.PortName, PIO_GET_DEVICENAME(ASC_2_CTS_DEV)); // 수정할 것 UartInitParams.CTS.BitMask = ASC_2_CTS_BIT; // 수정할 것 UartInitParams.DefaultParams = &UartDefaultParams; ST_ErrorCode = STUART_Init("UART3", &UartInitParams); // !!============= ① =============!! #ifdef STTBX_PRINT if(ST_ErrorCode != ST_NO_ERROR) { /*STUART is not initialized*/ printf("STUART ERROR\n"); } LOCAL_PRINT(("STUART_Init()=%s\n",GetErrorText(ST_ErrorCode))); #endif return (ST_ErrorCode); }
기존의 UART_Setup() 는 ASC_3 를 사용하게 세팅되어 있었다. 우리는 앞에서 수정한 것처럼 ASC_2 를 사용할 것이기 때문에 모두 ASC_2 로 수정해야 한다.
여기까지의 수정을 모두 마치고나서 실행해보면, 부팅화면이 uart 를 통해 보일 것이다. 다시 한번 얘기하지만, 두번째 문제점은 프로그램 'A' 를 사용할 때만 적용한다.
다음에 언급하겠지만, 'B' 는 라이브러리 문제다.
유의할 점
앞의 UART_Setup() 에서는 “UART3” 를 초기화 했다. 지금까지는 tbx 를 통해서 uart 를 테스트하는 방법을 설명했다. tbx 와 연동하기 위해서는 uart 와 tbx 의 세팅을 맞춰주어야 한다.
7710ref/testapps/shared/tbx.h
/* Exported Constants -------------------------------------------------- */ /* Exported Variables -------------------------------------------------- */ extern ST_DeviceName_t TBX_DeviceName; /* Exported Macros ----------------------------------------------------- */ #define TBX_UART_DEVICE MODEM_UART_DEV // 여기서 지정해주는 ASC 를 TBX 가 사용한다. 기본적으로는 UART3 으로 지정되어 있음 /* Exported Functions -------------------------------------------------- */ ST_ErrorCode_t TBX_Setup(void);
7710ref/testapps/shared/7710/tbx.c
ST_ErrorCode_t TBX_Setup(void) { ST_ErrorCode_t ST_ErrorCode = ST_NO_ERROR; STTBX_InitParams_t STTBX_InitParams; memset(&STTBX_InitParams, '\0', sizeof( STTBX_InitParams_t ) ); STTBX_InitParams.SupportedDevices = TBX_DEVICE; STTBX_InitParams.DefaultOutputDevice = TBX_DEVICE; STTBX_InitParams.DefaultInputDevice = TBX_DEVICE; STTBX_InitParams.CPUPartition_p = system_partition; #if defined(REPORT_TO_UART) strcpy(STTBX_InitParams.UartDeviceName, UART_DeviceName[TBX_UART_DEVICE]); // 여기가 핵심!!!! (UART_Setup 에서의 UART 포트와 일치시켜야 함) // strcpy(STTBX_InitParams.UartDeviceName, UART_DeviceName[3]); // 바로 숫자를 적어주어도 된다!! #endif ST_ErrorCode = STTBX_Init(TBX_DeviceName, &STTBX_InitParams ); #ifdef REPORT_TO_CONSOLE if ( ST_ErrorCode == ST_NO_ERROR ) { LOCAL_PRINT(("STTBX_Setup(%s)=OK\n", TBX_DeviceName)); } else { LOCAL_PRINT(("STTBX_Setup(%s)=FAILED\n", TBX_DeviceName)); } #endif return ( ST_ErrorCode );
차후에 TBX 의 UART 포트를 바꾼다면, 앞에서 설명한 UART_Setup() 과 TBX_Setup() 의 포트를 맞춰주어야 한다.
라이브러리 문제
두번째 문제까지 해결하고 나서 'B' 를 돌려봤다. 그런데 동작하지 않았다. 'A' 는 동작하지만, 'B' 는 동작하지 않았다. 특별한 설정이 다르지도 않았다. 스코프로 찍어본 결과 신호는 나가고 있었다. 문제는 바로 라이브러리 였다.
'A' 는 7710 cut 3.1 기반이었고, 'B' 는 7710 cut 2.1 기반이었다. 결국 'A' 의 라이브러리(stapi_stpti4.lib) 를 'B' 에 복사해서 실행했더니 잘 돌아갔다.