우선 저 두 파일의 용도와 역할에 대해서 이해할 필요가 있다. 그 후에 5517 bus 에 관해 알아보도록 하자!
전체 메모리의 설정을 해주는 파일이다. 파일을 보면 알겠지만, 처음에 전체 메모리 영역을 잡고, bank 에 따라서 시작 주소를 정해주고, 그로부터 얼마만큼 용량을 잡는다.
memory FLASH0 0x7Fe00000 (2*M) ROM memory SDRAM 0xC0000000 (16*M) RAM
위의 예를 볼 것 같으면, FLASH0 라는 디바이스는 시작 주소가 0x7fe00000 에서부터 2M 용량을 잡는다. 왜 하필 2M 일까?? 곰곰히 생각하면 이유를 알 수 있다. 전체 메모리의Region3 의 범위가 0x40000000 에서 0x7fffffff 까지이기 때문이다. FLASH 영역은 Region3 중에서도 bank5 에 잡혀있다. 당연히 가장 마지막 이기 때문에,
0x7fffffff - 0x7fe00000 = 1fffff (약 2M)
또, 파일에서 0x7F800000 이라면, 용량은 8M 로 잡아주어야 한다.
만일 8M 보다 많거나 적게 잡아주면, hex 파일을 만들 때 에러가 발생한다. 반드시 정확하게 잡아주어야 한다.
그리고 나서 컴파일을 하고 hex 파일을 만들고, 그안을 볼 것 같으면, 위에서 정해준 주소가 가장 앞단에서부터 시작한다는 것을 알 수 있다. 나중에 Flash 가 write 할 때는 바로 이 주소를 참조한다.
나중에 CPU는 각각의 디바이스를 하나의 큰 메모리로 보기 때문에 0x7fe00000 부터는 플래시를 의미하지만 CPU는 램의 일반적인 주소로 인식한다.
이 파일은 각각의 bank 0~ 5까지의 설정을 담고 있다. 하나의 뱅크는 4개의 레지스터로 세팅되어 있는데, 이것은 각각의 시간 타이밍등을 나타내고 있다. 기본적으로 메모리맵은 다음과 같이 설정되어 있다.
Bank0 0x40000000-0x4fffffff SDRAM 32Mbyte (256 MBit) Bank1 0x50000000-0x5fffffff STEM0/SRAM (256 MBit) Bank2 0x60000000-0x6fffffff STEM1 (256 MBit) Bank3 0x70000000-0x7effffff ATAPI/DVB-CI (240 MBit) Bank4 0x7f000000-0x7f7fffff DVB-CI ( 64 MBit) Bank5 0x7f800000-0x7fffffff SFLASH 8Mbyte ( 64 MBit)
기존의 메모리맵을 변경하고 싶다면, 아래와 같이 직접 레지스터에 적어주면 된다.
poke -d 0x202ff830 0xFD poke -d 0x202ff840 0xFE
위는 BANK_3_TOP_ADDRESS 과 BANK_4_TOP_ADDRESS 를 레지스터를 세팅해주는 부분이다. 하지만 해보면 알겠지만, 총 32개의 bit 중에서 8개의 bit만 바꿀 수 있기 때문에 어느정도 한계가 있다.
두 파일 모두에서 각각의 BANK의 시작 주소를 나타낼 수 있다. 결론부터 얘기하자면, 2개의 파일에서 뱅크의 영역은 같아야 한다. 설사 같지 않더라도, 같은 범위내에 있어야 한다.
더 정확히 얘기하면, 레지스터의 범위가 382_um.cfg 의 범위보다 커야 한다.
만일 두개의 파일이 각각 가리키는 주소가 다르다면, 컴파일 에러는 없겠지만, 궁극적으로 우리가 원하는 플래시를 읽고 쓰는 동작은 하지 않을 것이다.
이번에는 하드웨어적인 시각에서 5517 을 접근해보겠다. SSC(Synchronous serial controller) 와 ASSC(Asynchronous serial controller) 이다.
풀어서 설명하자면, 동기적 직렬 통신 과 비동기적 직렬 통신이라고 할 수 있겠다.
좀 더 이해하기 쉽게 예를 들어 설명하겠다.
방식 | 디바이스 |
SSC | I2C |
ASSC | UART |
5517 에서는 각각의 비동기 또는 동기적으로 동작하는 디바이스에 대응하기 위해, 앞에서 설명한 SSC 와 ASSC 포트를 지원하고 있다.
그렇다면, 과연 SSC 와 ASSC 의 차이는 뭘까? 그것은 바로 클럭(시간)이다.
우선 I2C 의 예를 들어보자! I2C 는 SDA 와 SCLK 로 통신한다. 하나는 데이터를 주고받고, 하나는 클럭신호이다. 통신을 하려면, 현재의 데이터가 보내는 것인지, 받는 것인지 알아야 한다. 그러려면, 그것을 구분할 수 있는 뭔가가 필요한 데, 그것이 바로 클럭신호이다. 그래서 I2C 는 일정한 클럭단위로 동작한다. 그래서 우리는 I2C 가 동기식으로 동작한다고 부른다.
이번에는 UART 를 예로 들어보자! 현재 DAC5000 에서는 2 개의 ASSC 를 사용하고 있다. 하나는 시리얼 통신을 위함이고, 나머지는 프론트(FRONT)를 위함이다. 앞의 I2C 와 다른 점이라면, 바로 RX 와 TX 가 있다는 점이다. 그렇다. 통신 경로가 2 개라는 것이다. 데이터를 보내는 통로와 받는 통로가 따로 있는 것이다. 그래서 굳이 I2C 와 같이 현재 데이터의 구분을 할 필요가 없다. 결국 클럭에 관계없이 통신을 한다.
그래서 우리가 UART 는 비동기식으로 동작한다고 부른다.