이 블로그 검색

2011년 12월 16일 금요일

서비스와 디바이스 드라이버



블랙핀을 이용한 소프트웨어에서는 시스템 서비스와 디바이스 드라이버, 커널, 응용 계층으로 나눌 수 있다. 아래 그림은 이를 보여준다.
응용계층이나 커널, 디바이스 드라이버 계층에서 모두 시스템 서비스를 제어할수 있다.

그러면 시스템 서비스는 무엇을 말하는가?
임베디드 시스템에서는 기본적으로 있어야 하는 기능들이 있다.
PLL, DMA, interrupt controllers, timers, flags, port etc등은 대부분의 임베디드 프로세서에서 다루는 부분이다.  여기서 flags는 GPIO를 말하며 port 제어는 Multiple functional port control를 의미한다.

우리는 이런 기능을 시스템 서비스(자원)라고 명칭한다.  디바이스는  우리가 익히 알고 있는 Interface들과 주변장치등들이다.   디바이스 드라이버는 시스템 서비스를 이용하여 디바이스가 커널이나 응용계층에서 사용되어 질수 있도록 한다.

 간단한 예로 UART를 들수 있다.

UART는 인터럽트, DMA, Flag, PLL등 거의 모든 시스템 서비스(자원)가 사용된다.
우리의 논의는 이러한 디바이스 드라이버를 구현시 다른 디바이스에서도 선택적으로 사용되는 시스템서비스를 독립된 계층으로 분리하여 함수의 재사용을 추구하며 소프트웨어 계층을 둠으로서 디바이스 드라이버구현시 시스템 서비스만을 이용하여 구현할수 있게 할수 있다.
물론 응용계층과 커널계층에서 직접 시스템서비스를 사용하는 것도 가능해 진다.

하지만 블랙핀 DSP의 적용범위가 인버터나 산업용 제어에서 많이 쓰이는 관계로 이러한 계층화에 따라 Resource의 낭비를 고려 해야 한다고 본다. 또한 간단히 레지스터의 세팅으로 끝날 부분을 시스템서비스와 디바이스 드라이버를 이해하며 사용해야 하는 부담도 있다. 이러한 계층구조는 커널과 복잡한 응용계층이 존재할때 의미가 있어 보인다. 이때는 사용하는 것이 여러가지 이유로 유리한다. 시스템 서비스와 디바이스 드라이버가 에러없이 안정하게 Standalone과 VDK 모드로 ADI에서 직접 제공하고 있다.

기본적으로 VisualDSP를 설치하면
 C:\Program Files\Analog Devices\VisualDSP 5.0\Blackfin\lib\src 폴더에 서비스, 디바이스 드라이버, C Runtime & DSP등의 라이브러리가 포함되어 있다. 
















위의 그림이 시스템 서비스들을 나타낸다.

- Dynamic Power Management : 동작모드 설정, CCLK, SCLK설정 등
- External Bus Interface Unit (EBIU): SDRAM 설정및 SCLK 변경
- Interrupt Manager
- Deferred Callback Service: 인터럽트 서비스 루틴 관리
- DMA Manager
- Flag Control : GPIO
- Timer Control : 타이머
- Port Control: 다중 기능 포트제어 및 각 기능별 포트제어


 위의 그림은 디바이스 드라이버의 구조이다.


adi_dev_xxx() 은 각각의 디바이스의 adi_pdd_xxx()를 호출한다. adi_pdd_xxx()는 static으로 선언되어 각각의 디바이스 별로 존재하게 되고 adi_dev_xxx()는 해당 디바이스를 찾아 adi_pdd_xxx()를 호출해 주는 구조이다.
각각의 디바이스 드라이버 문서는 C:\Program Files\Analog Devices\VisualDSP 5.0\Blackfin\docs\drivers 폴더내에 있다. 참조 하기 바란다.

디바이스 드라이버에서 인터럽트 처리는 중요한 문제이다. 이 부분만 이해해도 디바이스 드라이버 이해가 쉬워진다.  응용이나 커널계층에서 Callback 함수를 만들고 이함수를 통해 인터럽트 처리를 하길 원하다면 디바이스 드라이버는 다양한 인터럽트를 이 함수를 호출해야 한다. 인터럽트 ID와 Callback 함수 관리를 해야 하며 다른 디바이스드라이버와도 잘 조화를 이루어야 한다.  같은 IVG에서는 소프트웨어적으로 인터럽트를 분리해야 하며 adi_dev에서 처리하여 해당 디바이스이 adi_pdd호출해 주어야 한다.


 

댓글 없음:

댓글 쓰기