HD 소스(DAC5000)에서 nim 이 어떻게 동작하는지 설명하고 있다.

nim 이 하는일

모듈레이터로 부터 스트림이 들어오면, 각 스트림에 따라(지상파, cable 의 종류) 각각의 channel map 이 존재하기 마련이다. 이 각각의 channel map 에 맞게 나누어 주고, 튜너를 통해 튜닝을 한다.
튜닝이 성공하면, TS 스트림이 파싱되어 나오고, 그 중에서 PSIP 파싱이 수행되면, 채널 정보가 들어온다.
좀 더 쉬운 이해를 위해 관련 소스를 살펴보기로 한다. nim 소스는 src/nim/nimlib.c 아래에 있다.

...
const U32 T_Channel_Plan[] = {  0,/* CH. 1 is not supported*///  지상파 채널 맵
 552500, 552500, 612500, 672500, 772500, 832500,1752500,1812500,1872500,1932500,/*1~10*/
1992500,2052500,2112500,4712500,4772500,4832500,4892500,4952500,5012500,5072500,/*11~20*/
5132500,5192500,5252500,5312500,5372500,5432500,5492500,5552500,5612500,5672500,/*21~30*/
5732500,5792500,5852500,5912500,5972500,6032500,6092500,6152500,6212500,6272500,/*31~40*/
6332500,6392500,6452500,6512500,6572500,6632500,6692500,6752500,6812500,6872500,/*41~50*/
6932500,6992500,7052500,7112500,7172500,7232500,7292500,7352500,7412500,7472500,/*51~60*/
7532500,7592500,7652500,7712500,7772500,7832500,7892500,7952500,8012500};	/*61~69*/
...

지상파의 경우 위의 채널 맵을 사용한다. 아래는 지상파의 경우이다. 소스를 보면 바로 위에서 정의한 채널 맵을 사용하고 있다.

case ATSC_AIR:
			if((1<chNum) && (chNum<70)) 	rfFreq = (T_Channel_Plan[chNum] + 17500) * 100;
			else return INVALID_PARAM;
 
			break;

다음은 cable 의 경우이다.

case ATSC_AIR:
			if(chPlan == HRC)
				{
				if(chNum == 1) rfFreq = 73750000;
				else if((2<chNum) && (chNum<5)) 		rfFreq = 55750000 + (chNum - 3) * 6000000;
				else if((4<chNum) && (chNum<7)) 		rfFreq = 77750000 + (chNum - 5) * 6000000;
				else if((6<chNum) && (chNum<14)) 	rfFreq = 175750000 + (chNum - 7) * 6000000;
				else if((13<chNum) && (chNum<23)) 	rfFreq = 121750000 + (chNum - 14) * 6000000;
				else if((22<chNum) && (chNum<95)) 	rfFreq = 217750000 + (chNum - 23) * 6000000;
				else if((94<chNum) && (chNum<100)) 	rfFreq = 91750000 + (chNum - 95) * 6000000;
				else if((99<chNum) && (chNum<158)) 	rfFreq = 649750000 + (chNum - 100) * 6000000;
				else return INVALID_PARAM;
				}
			else if((chPlan == IRC) || (chPlan == STD))
				{
				if(chPlan==IRC && chNum == 1) 		rfFreq = 75000000;
				else if((2<chNum) && (chNum<5)) 		rfFreq = 57000000 + (chNum - 3) * 6000000;
				else if((4<chNum) && (chNum<7)) 		rfFreq = 79000000 + (chNum - 5) * 6000000;
				else if((6<chNum) && (chNum<14))		rfFreq = 177000000 + (chNum - 7) * 6000000;
				else if((13<chNum) && (chNum<23)) 	rfFreq = 123000000 + (chNum - 14) * 6000000;
				else if((22<chNum) && (chNum<95)) 	rfFreq = 219000000 + (chNum - 23) * 6000000;
				else if((94<chNum) && (chNum<100)) 	rfFreq = 93000000 + (chNum - 95) * 6000000;
				else if((99<chNum) && (chNum<158)) 	rfFreq = 651000000 + (chNum - 100) * 6000000;
				else return INVALID_PARAM;
				} 
			else return INVALID_PARAM;	
 
			break;

앞에서 정의한 지상파 채널 맵을 그대로 사용하지 않고, 수정해서 사용한다.

  • computer/digitalarena/nim_소스에서_알아야_할_것.txt
  • Last modified: 3 years ago
  • by likewind