기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요~

16c554칩을 컨트롤하다가 질문이 있어서 글을 올립니다.

먼저 제가 작업하고 있는 환경은 이솝보드는 아니구요, smdk2440에 16c554칩을 이용해서 포트를 4개 추가하는 중입니다.

smdk2440에서 제공하는 포트 3개가 다 잡혀있는 상태구요. 추가적으로 4개를 더 사용해야 합니다.

현재는 하드웨어적으로 16c554칩에 문제가 없는지 확인하는 단계인데 정상 작동을 판단하기 위해서

디바이스 드라이버가 아닌 일반 어플로 직접 칩을 제어하려고 합니다.

제가 아직 리눅스 초보라 디바이스 드라이버를 만드는 작업보다 일반 어플에서 작업을 해보려구 하는데요.

먼저 제가 작성한 코드입니다.

여긴 선언부분 이구요..
#define UART_BASE (0x20000000+0x2000) //GCS4 + 10000000000000(2)
#define UARTA (0) //10000000000000(2)
#define UARTB (0x100) //10000100000000(2)
#define UARTC (0x200) //10001000000000(2)
#define UARTD (0x300) //10001100000000(2)

#define RHR 0x0
#define THR 0x0
#define IER 0x1
#define FCR 0x2
#define ISR 0x2
#define LCR 0x3
#define MCR 0x4
#define LSR 0x5
#define MSR 0x6
#define SPR 0x7

#define DLL 0x0
#define DLM 0x1

#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)

....

이쪽은 main함수입니다.
iFd = open("/dev/mem", O_RDWR | O_SYNC);
 
  if(iFd < 0)
  {
    printf("open errn");
    return -1;
  }
 
  (void*)pMap = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, iFd, UART_BASE & ~MAP_MASK);
 
  pAddr = pMap + UARTA;
 
  *(pAddr + IER) = 0x0F;
 
  *(pAddr + FCR) = 0xC7;
 
  //_nop_();
  int i = 100;
  while(i--);
  printf("startn");
 
  *(pAddr + FCR) = 0xC1;
 
  *(pAddr + LCR) = 0x83;
 
  *pAddr = 12; // 9600 //DLL
  *(pAddr+1) = 0; // 9600 //DLM
 
  *(pAddr + LCR) = 0x03;
 
  temp = (char)(*pAddr);
 
  for(int i=0; i<600000; i++)
  {
   
    // 수신
    temp = *(pAddr + LSR);
   
    while(temp & 0x01)
    {
      *(pAddr + MCR) = 0x08; //0x0
      temp = (char)(*pAddr);
      printf("read [%d]n", temp);
     
      sleep(1);
    }
   
    // 전송
    temp = *(pAddr + LSR);
   
    if(temp & (1<<5))
    {
      *(pAddr + MCR) = 0xA; //0x2
      *pAddr = 'a';
      printf("write 'a'n");
     
      sleep(1);
    }
   
  }
 

하드웨어는 RTS가 high상태가 되면 출력상태로 인식하게 되있구요,
그래서 위와 같이 칩을 직접 제어하도록 해봤습니다.
RTS신호선에 low, high는 제어가 되는걸 보면 칩셀까진 성공한거 같은데요,
칩셀하고 패리티비트나 보레이트 등을 설정하고 RTS에 high 준 다음에 바로 데이타를 쓰면
신호선에 데이타가 깨지던지 말던지 아무신호나 뜰줄 알았는데 반응이 없습니다.

제가 뭔가 착각을 하고 있는거 같은데 uart쪽은 처음이라 뭐가 빠진건지 모르겠네요.
조언 부탁드리겠습니다~


유형목

2009.06.05 03:19:18
*.32.117.22

리눅스에서는 어플리케이션 프로그래밍과 device driver 프로그래밍이 완벽하게 분리되어 있습니다.

리눅스의 어플리케이션에서는 /dev/ttyS0 장치 열고 C 라이브러리에서 제공하는 함수를 써서 프로그래밍 합니다.
리눅스에서는 리눅스에서 제공하는 방식대로 프로그래밍 하셔야 합니다.

유닉스/리눅스상에서의 시리얼포트를 써서 프로그래밍하는 방법은 다음 문서를 참고하시기 바랍니다.
http://www.easysw.com/~mike/serial/serial.html

위의 내용처럼 시리얼 포트를 직접 콘트롤하는 방법은 펌웨어나 RTOS에서 device driver를 짤때 사용되는 방법이겠죠?
리눅스 커널에서 16C554 관련 Device Driver 를 수정하시려면 다음글을 참고하세요.
http://www.aesop.or.kr/?document_srl=22538

16C554 칩 리눅스 커널에 포팅 -> 부팅시 /dev/tty??? 장치명 자동으로 생성 -> 어플리케이션에서 open() 함수를 써서 /dev/tty??? 장치 열고
C 함수를 써서 프로그래밍  -- 대충 순서가 이렇게 되겠네요.

타겟보드가 없다면 데스크탑 컴퓨터에 리눅스를 설치하고 "어플리케이션에서 open() 함수를 써서 /dev/tty??? 장치 열고 C 함수를 써서 프로그래밍" <- 이부분만 우선 진행하신 다음 나중에 장비에 올릴때 크로스 컴파일만 하셔서 올리면 됩니다.

배신규

2009.06.05 03:35:09
*.105.110.34

먼저 답변 주셔서 고맙습니다.^^
그럼 일단은 디바이스 드라이버 포팅이 우선이겠네요. 어떻게든 신호선에 high뜨는것만 보려고 했는데 너무 쉽게 생각했나 봅니다.ㅎㅎ
알려주신데로 다시 한번 도전해보겠습니다. 막히면 다시 조언 부탁드릴께요.^^

한영민

2009.06.13 02:28:33
*.14.30.76

지나가다가 ^^.. 허접 참고.

해당칩을 일단 검증만 하시려면, 일단, firmware로 확인하시는것이 빠를듯합니다.

위에 코드를 보니까 드라이버하고 어플해서 하는것보다 그쪽으로 하시는것이 빠를듯 싶습니다.

배신규

2009.06.19 18:44:17
*.105.110.34

한영민님 답변 감사합니다. 펌웨어로 확인 하시라는 말씀은 부트로더부분을 말씀하시는 건가요?

일단 tx쪽 신호가 뜨지 않았던것은 테스트보드에 16c554칩에 들어가야할 크리스탈이 안달려있었네요.-_-;
에효..
크리스탈 다니까 일단 신호선이 동작을 해서 하드웨어적인 문제는 없는걸로 판단하고 일단 마무리했습니다.
위에 코드가 정확하게 동작하지 않을 수도 있지만 하드웨어 체크는 되네요.ㅎㅎ
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
5308 qt 종료후 segmentation fault, Illegal instruction 오류. Supsupi 2012-04-26 1489
5307 Android kernel 2.6.35 버젼 다운 받는 방법? [3] 쾌도난마 2012-02-28 1489
5306 3G Modem 간혈적 응답 없는 경우. 천동이 2013-10-21 1489
5305 [질문] Nand Flash Memory 인식에 관한 질문입니다. [3] 이재훈 2006-08-30 1488
5304 PC100 보드에 관해 문의드립니다. [1] 오사장 2012-01-10 1488
5303 ICS를 구동 하기 위한 최소한의 H/W 사양? [5] 땜철학자 2012-02-16 1487
5302 리눅스 병렬처리와 OpenMP 관련 질문드립니다. [4] Supsupi 2013-02-12 1487
5301 안녕하세요 ffmpeg 질문있어서 문의드립니다.. [1] 이호석 2013-03-15 1486
5300 오리겐 보드 V310 PCIe 및 SATA 지원 문의 [5] 김장균 2012-02-11 1484
5299 외산 폰 KT MMS 사용 방법 플로이드 2013-05-08 1484
5298 카메라 시스템을 공부하는데 질문이 있습니다. [3] 할라 2013-06-11 1484
5297 [완료]gulim.ttf 파일 설정 [2] 윤치호 2007-04-26 1483
5296 wince6.0 무선 랜 접속 프로그램 깜성 2014-04-11 1483
5295 asound.conf 와 hal 의 연동에 대한 질문 [2] Soyul 2012-04-26 1482
5294 외부 uart 관련 질문 [1] 문철민 2012-05-31 1482
5293 Slackware 11.0 Install guide 가지고 계신분? [1] 임장욱 2008-03-01 1481
» 16c554관련 질문 있습니다. [4] 배신규 2009-06-05 1481
5291 BCM4329 wifi _ linux 2.6.32 driver 문제 [3] 선수 2011-04-20 1481
5290 갤3 엘티이 빌드해보신분? [2] 옹치킨붐붐 2013-01-19 1481
5289 OrigenBoard Exynos4210 BSP..관련 [1] 마니아 2013-07-25 1481

사용자 로그인