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

안녕하세요~

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 [해결]SD data값을 틀리게 읽네요. [6] 윤영진 2007-12-17 661
5307 [완료]usb-to-serial 보드 접속에대해 궁금합니다. [4] 박영진 2007-12-17 1127
5306 [질문] 삼성 7인치 LCD 관련^^; [1] 박명대 2007-12-18 2365
5305 Target Board에 WinCE 이미지 부팅 성공^ ^ [2] 김재현 2007-12-18 906
5304 [완료]WinCE 이미지 포팅한 후 Reset시 초기 화면 깨짐 문제 [6] 김재현 2007-12-18 1883
5303 [완료] USB storage 인식 감지 질문입니다. [4] 강성곤 2007-12-18 1347
5302 [완료] 프로세서가 먹통되었을 때 리셋버튼 눌러도 반응이 없는 경... [3] 오주열 2007-12-18 1386
5301 udev를 적용하려면, 어떻게 해야 합니까? [2] 신용대 2007-12-19 1174
5300 [완료]s3c2410-uboot에서 nand readid하기 [5] 유용출 2007-12-20 1392
5299 sd card 질문입니다. [7] 박진우 2007-12-21 1273
5298 [완료]u-boot sdram 셋팅과 nor 파티셔닝 관련 질문입니다. [2] 김유석 2007-12-22 814
5297 [완료]공유기 없이 VMware network 환경 설정 [7] 최재혁 2007-12-24 3694
5296 sd카드에 rootfs을 담으려고합니다. [1] 김성민 2007-12-27 767
5295 [완료]s3c2410 STN LCD 흑백에 관해 질문 드립니다. [2] 백승준 2007-12-27 1102
5294 [완료] MP2530용 Root FS 직접 꾸미기.. [3] 정경진 2007-12-27 1379
5293 [완료]부트로더 i2c 질문드립니다. [2] 김유석 2007-12-27 858
5292 질문있습니다. [4] 황주현 2007-12-31 858
5291 [완료] serial port추가를 하려면..? [3] 김태현 2008-01-02 2376
5290 [완료]메모리 맵에 대한 질문입니다. [5] 김신 2008-01-03 685
5289 [완료]모듈에서 fb정보를 읽는법에 대한 질문. [2] 박기호 2008-01-04 583

사용자 로그인