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

안녕하세요~

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 OK 만 출력 추가 질문 2차 [1] 만년설화 2011-06-15 564
5307 s3c2440a 3차보드 질문이요.. [2] 김용인 2008-06-25 565
5306 오드로이드 부팅 로그좀 확인 부탁드립니다. [2] 송형돈 2009-11-24 565
5305 cntl C가 먹지 않습니다. [1] 블루 2010-11-13 565
5304 v210 , u-boot 설정 저장 에러 [1] 김정중 2010-11-23 565
5303 __mmap_switched까지 안 가는 현상 발생 [1] 데카 2011-07-07 565
5302 [RK3399] FireFly Android Compile Error [1] 김민욱 2018-03-20 565
5301 [완료] 이솝 MP2530F 보드를 살릴수 있을까요? [3] 두현택 2008-10-29 566
5300 Eclipse에서 자동으로 밑줄이 쳐진 라인이 있는데 이게 의미 하는게... file [1] 시안 2010-05-24 566
5299 cat filename > mtdblock 시 write되는 진행율 보는 방법이 있을까... [1] 조재영 2010-11-29 566
5298 시스템 어플리케이션을 종료시키는 방법이 있나요? [1] sonbong 2011-06-21 566
5297 aesop6410 카메라 커넥터 [2] 박경호 2009-04-15 567
5296 Video , Graphics 동시 출력 문의 [2] 권도홍 2009-12-11 567
5295 V210 보드연결 방법 [1] 과니 2010-10-28 567
5294 [오드로이드 S 빌드] 빌드가 되질 않아요. [1] 드로준 2010-11-25 567
5293 임베디드 리눅스 초보입니다~ㅠ.ㅜ [1] 황순일 2011-05-19 567
5292 삼성의 SmartThings와 호환가능한 제품을 개발하기 위한 규약에 대한... [3] 테크 2018-09-29 567
5291 [완료] kernel 2.6.10 에서 RAM의 용량을 설정하는 질문 [2] 장계석 2008-03-04 568
5290 webserver 개발관련 작업 환경 구성 및 관련 자료... [2] 허경 2010-04-05 568
5289 Provider "gps" unknown 은 어떨때 나는 에러인가요? [1] 바람돌이0 2010-04-23 568

사용자 로그인