이 블로그 검색

2011년 12월 19일 월요일

Core Timer

Core timer는 주기적인 interrupts를 발생할 수 있는 programmable 32-bit interval
timer이다. 다른 peripherals와 다르게 core timer는 Blackfin core 안에 위치하며 core
clock 즉, CCLK로 동작한다.

다음은 Core Timer의 특징들을 요약 정리한 것이다.
1) 8-bit prescaler를 가진 32-bit timer.
2) CCLK로 동작.
3) 전용 high-priority interrupt channel.
4) Single-shot 또는 연속적인 동작.


다음은 Core timer에 대한 block diagram이다.

















[그림 4-1] Core Timer Block Diagram

Core timer는 임의의 chip pins와 직접적으로 상호작용하지 않는다.
우선, timer가 enabling되기 전에 TCOUNT register를 초기화해야 한다. 물론, 직접
TCOUNT register에 작성할 수도 있지만, TPERIOD register를 통하여 작성될 수도 있다.
[그림 4-2]는 Core timer Control Register TCNTL을 보여주고 있다.
[그림 4-2] TCNTL register.
TCNTL 안에 있는 TMREN bit를 setting함에 의해서 timer가 enabling되면, TCOUNT
register는 prescaler TSCALE이 만료될 때마다 한번 감소하게 된다. 즉, TSCALE +
CCLK clock cyles 1개마다 한번 감소한다. 예를 들면, TSCALE register의 값이 “0”이면,
TCOUNT register의 값은 모든 CCLK clock cycle마다 한번 감소하고, TSCALE이 “1”이
면, 모든 2개의 CCLK clock cycles마다 한번 감소한다.
TCOUNT register의 값이 “0”이 되면, interrupt가 발생하게 되고, TINT bit는 TCNTL
register안에서 set된다.
만일, TAUTORLD bit가 set되어 있다면, TCOUNT register는 TPERIOD register의 내용
을 다시 loading하고, counting을 시작한다. 그러나, 만일, TAUTORLD bit가 clear되어 있
다면, timer는 동작을 멈춘다.
또한, TMPWR=0일 때, TMREN=1이면, undefined 동작을 하는 데 주의하자.
Core timer interrupt request는 edge-sensitive이고, interrupt가 servicing되면 바로 자
동으로 hardware에 의해서 clearing된다.






예로 TPERIOD에 15000을 세팅하면 CCLK=400[MHz]이므로, 150[us]마다 Core Timer
Interrupt가 발생하게 된다

2011년 12월 18일 일요일

Flag(GPIO)-General-Purpose Ports

ADSP-BF506F인 경우에는 3개의 Port modules로 분류할 수 있다
port F/G/H 이다. 다른 ADSP-BFXXX프로세서의 GPIO는 해당 프로세서에 맞게 특화되었지만 제어레지스터는 동일하다.

1) Port F : 16 pins.
(1) PPI data signals.
(2) UART0/1 signals.
(3) SPORT0 signals
(4) SPI0 signals.
(5) CNT0(GP Counter 0) signals.
(6) PWM0 signals.
(7) GP Timer signals.
(8) 부가적인 SPI0/1 slave selects.
(9) GPIOs.
2) Port G : 16 pins.
(1) SPORT1 signals
(2) CAN signals.
(3) ACM signals.
(4) PPI signals.
(5) GP Timer signals.
(6) PWM1 signals.
(7) CNT1(GP Counter 1) signals.
(8) SPI1 signals.
(9) UART0 signals
(10) RSI signals.
(11) GPIOs.
3) Port H : 3 pins.
(1) SPORT1 signals
(2) ACM signals.
(3) SPI0/1 slave select signals.
(4) GP Timer signals
(5) GPIOs.
부가적으로 독립적인 pins로 구성된 TWI signals를 제공한다.

Port의 초기모드는 GPIO Mode이다.
만약 Peripheral기능을 사용하고 싶다면
    1. PORTx_FER의 해당 비트를 셋하여 Enable시킴
    2. PORTx_MUX로 해당 기능을 선택해 주어야 한다.
하나의 물리적인 포트는 다양한 기능의 입출력으로 사용됨으로 내부 레지스터를 통해 스위칭이 되어야 한다.

floating pin 즉, 입,출력으로 사용하지 않는 GPIO pin은 특별히, pull-up/down해 줄 필요
가 없다.

GPIO로 사용될 경우

(1) 출력으로 사용될 때 :
① SCLK에 동기
② 레지스터
     -  PORTxIO_DIR : 방향 설정(입/출력, 초기값 입력)
     - PORTFIO, PORTGIO, PORTHIO - GPIO data registers이며 쓰기동작에서 동시에 값이 변하므로 주의해야 한다.
     - PORTxIO_SET,PORTxIO_CLEAR, PORTxIO_TOGGLE - 비트 단위로 동작하며 그 결과가 위의 GPIO data registers에도 반영되며 이것을 interrupt source로 사용할 수 있다는
것이다. 이때, edge-sensitive pin이 interrupt request를 생성하는 경우에 ISR은 clear
register를 통하여 각각의 GPIO latch를 clearing함에 의해서 그 request를 인정해야 한
다는 것이다. 또한, PORTxIO register는 PORTxIO_INEN register에 의해서 enabling된 input pin의
상태도 반영해 주는 데 주의하기 바란다.


(2) 입력으로 사용될 때 :
① core와 system clocks 사이의 potential latency를 고려해야 한다. 즉, processor에
의해서 입력의 변화가 받아들여지기 위해서는 3 SCLK latency를 가진다.

② 기본적으로 모든 peripheral pins는 reset 이후에 GPIO 입력으로 setting된다. 그러
나, GPIO input drivers는 power 소비를 최소하기 위해서 disabling되어 있다는 데 주의
하자. 그러므로, digial input 또는 interrupt input으로 사용하려면, PORTxIO_INEN
register에서 enabling해 주어야 한다. 만일, enabling해 주지 않는다면, input pins에 변
화가 processor에 의해서 인식되지 않는다. GPIO input enable registers(
PORTFIO_INEN, PORTGIO_INEN, 그리고, PORTHIO_INEN)는 input으로 사용될 임의
의 GPIO에 대한 input buffers를 enable하기 위해서 사용된다. 임의의 GPIO pin의 입력
driver가 enabling되면, 그 GPIO는 더 이상 output으로 작동하지 않는다. 즉, 동일한
GPIO에 대해서 input driver와 output driver를 동시에 enabling할 수 없다.
또한, 외부 pull-up resistors를 사용해 주는 것이 좋다.

(3) Interrupt에 사용될 때 :
각각의 GPIO는 interrupt를 발생하도록 구성될 수 있다. processor는 6개의 interrupt
channels를 통하여 interrupts를 요청하는 최대 35개의 비동기 off-chip signals까지 분별
할 수 있다. 임의의 pin을 interrupt pin으로 만들기 위해서는 해당 PORTxIO_INEN
register 안에 bit가 set되어야 한다. 물론, GPIO 기능을 가지도록 PORTx_FER register
안의 function enable bit는 clear되어 있어야 한다. edge의 경우에 both edge에 대해서
도 사용할 수 있다. interrupt 입력에 대한 triggering 시점은 GPIO polarity registers와
GPIO interrupt sensitivity registers 에 의한 bit별 정의되어 있다.
또한, PORTxIO_DIR registers는 출력으로 구성되어 있을 때, 그 GPIO의 input drivers가
enable 되었다면, software가 data/set/toggle registers에 writing함에 의해서 GPIO
interrupt를 triggering할 수 있다. ISR은 request를 인정하기 위해서는 GPIO를 clearing
해야 한다.


위의 그림은 GPIO interrupt flow이다.

3개의 GPIO modules의 각각은 2개의 독립적인 interrupt channels를 제공하는데, 기능은
동일하고, interrupt A/B라고 불린다. 양쪽의 interrupt channels는 각각의 GPIOs를
none, 어느 하나, 또는 양쪽의 interrupt channels에 할당하는 것을 허락하는 자신만의
mask register를 가지고 있다. 또한, 모든 mask registers는 “0”로 reset되어 있기 때문
에 어떠한 GPIOs도 default에서는 interrupt가 할당되어 있지 않다.
임의의 GPIO interrupt는 그 interrupt를 위한 모든 unmasked GPIOs의 logical OR에 의
해서 발생한다. 예를 들어서, 만일, PF0/1이 GPIO interrupt channel A를 위해서 양쪽이
모두 unmasked되었다면, GPIO interrupt A는 PF0 또는 PF1 어느 하나에 의해서
triggering되었을 때 발생될 것이다. 그러므로, ISR은 실질적으로 interrupt를 발생한
source를 알아내기 위해서 GPIO data register를 check해야 한다.


다음은 지금까지 설명한 GPIO interrupt 처리 routine으로서 임의의 GPIO module의
interrupt A channel에 대한 interrupt flow를 설명한 것이다.






























① level-sensitive interrupt로 사용될 때 :
㉠ signal이 pin에 asserting되고, program flow가 interrupt 되는 시간 사이에 최소 4
SCLK cycles의 latency가 존재한다.
② edge-sensitive interrupt로 사용될 때 :
㉠ 총 5 SCLK latency가 필요하다.
㉡ ISR은 GPIO clear register를 통하여 해당 GPIO latch를 clearing하는 부분을 사용
해야 한다.
그 밖에도 PORTxIO_POLAR, PORTxIO_EDGE 그리고, PORTxIO_BOTH registers를 가
지고 있다. default 값은 active high level이며, single edge이다.




Dynamic Power Management(PLL..)











왼쪽의 그림은 PLL관련한 블록도이다.
CLKIN를 통해 외부클락을 받아 CCLK, SCLK를 생성한다.
CCLK는 코어 클럭을 SCLK는 시스템 클럭을 의미한다.
CCLK >= SCLK의 등식이 성립한다.
해당 제어 부부은 아래의 레지스터 리스트에서 볼수 있다.




















표1. MSEL Encodings
Signal name
MSEL[]
VCO Frequency
DF = 0                      DF = 1
0
64x
32x
1
1x
0.5x
2
2x
1x
N = 3-62
Nx
0.5Nx
63
63x
31.5x
1 MSEL DF parameter를 조정하여, CLKIN VCO로 만드는 배율을 나타내고 있다.


표 2. Core Clock Ratio

Signal Name
CSEL[]
Divider Ratio
VCO/CCLK
Example Frequency Ratio(MHz)
VCO                 CCLK
00
1
300
300
01
2
300
150
10
4
400
100
11
8
400
50

2 VCO CCLK 비율을 나타내고 있다. CSEL parameter 조정하여 Core clock 조정한다


Table 3. System Clock Ratio

Signal Name
SSEL[]
Divider Ratio
VCO/SCLK
Example Frequency Ratio(MHz)
VCO                 SCLK
0000
Reserved
N/A
N/A
0001
50
50
0010
150
75
0011
150
50
0100
200
50
0101
300
60
0110
360
60
N = 7-15
N:1
400
400/N

3 VCO SCLK의 비율을 나타내고 있다. SSEL parameter를 조정하여 System clock을 조정한다.
만일,
 SSEL을 변경한다면,SCLK가 변하면서 주변장치의 data를 잃어버릴수도 있으니 주의하시오.















 -  PLL output clock SCLK CCLK로 나눈다
 -  PLL_DIV parameter 변경하여, CCLK SCLK frequency 변경 있다













PLL control 하는 operation이다
- 여러 register 값을 변경하여 PLL 동작을 제어한다.

 
- PLL processor operating mode 지시한다









-  Processor PLL_LOCKED bit set할떄까지의 SCLK를 정의한다.
-  Lock counter SCLK 1cycle 1 증가한다
-  Lock counter PLL_LOCKCNT register 정의된 값까지 증가하면, PLL_LOCKED bit setting된다.
















아래에는 간단 pll 세팅 예제 프로그램이다.


 void init_pll()
{
     unsigned int imask;
    *pPLL_CTL = SET_MSEL(16); /* Write new value for (400MHz)to PLL_CTL.*/
    ssync();
    *pVR_CTL = /*--- REPROGRAM VR_CTL ---*/
                          0x00B0 | /* Bits #7,6 set by default */
                          0x3000 | /* FREQ=00 indicates hibernate. FREQ=11 indicates non-Hibernate */
                          0;
     imask = cli(); /* VR_CTL Re-programming Sequence. */
     idle(); /* Core is idle'ed to allow the PPL to re-lock. */
     sti( imask );
/*----- REPROGRAM PLL_DIV ------*/
     *pPLL_DIV = SET_SSEL(4); /* PLL_DIV can be re-programmed on the fly.*/
   /* No core idling required. */
     ssync();
}

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호출해 주어야 한다.


 

Analog Devices(ADSP-BF592소개)

1. ADSP-BF592주요특징
 - . 가격 대비 최상의DSP성능으로 개발업체들은 보다 시스템 수준의 장점들로 더욱 복잡한알고리즘을 구동할 수 있다.
 -. 200 MHz 전력소비가 51mW에 불과하고, 대기전력이 1mW 미만이라 경쟁사 제품 대비 전력소비를 80% 줄였으며 배터리 수명을 연장시킨다.
 -. 400-MMAC/200-MHz 장치의 크기가 업계 최소 패키지인 9mm x 9mm로, 디자이너들은 제한된 공간 내에서 매우 높은 성능을 구현해낼 수 있다.
 -. 외장 메모리나 실행플래쉬 없이도 다양한 애플리케이션 구동에 최적화되어 있다. 주변장치 세트에는 SPORT 2개, PPI 1개, SPI 2개, 범용 카운터 4개가 포함되어 있으며 자체 프로그램된 인스트럭션 ROM 블록에는 VDK RTOS와 C 런타임 라이브러리가 포함된다.
 -. 상업·산업 온도등급으로 출시되며 자동차용으로도 검증되었다.
 -.휴대용 헬스케어 제품, 오디오 기기, CMOS 센서 기반 2-D 바코드 스캐너와 같은 이미지 생성 제품
 -.가격 및 출시블랙핀 ADSP-BF592는 1000개 구매시, 200-MHz 속도 등급을 기준으로 단가가 1.99달러이다(모델 번호 ADSP-BF592KCPZ-2). 프로세서는 샘플 공급 가능

2. 개발 플랫폼

 - 블랙핀 ADSP-BF592
이지키트 라이트(EZ-KIT Lite(R)) 평가보드는 ADI 공식판매처를 통해 정상가 199달러
 - EZ-KIT 에는 C/C++ 컴파일러, 어셈블러, 링커 등과 같은 ADI 비주얼 DSP++(VisualDSP++) 개발환경 평가보드가 포함
 - 150달러에 공급되는 블랙핀 에뮬레이터(emulator, ADZS-ICE-100B)는 디자이너들에게 종합적 개발 플랫폼을 제공함으로써 블랙핀 BF592 구매 비용을 줄였다.
 - 프로세서 최적화와 전반적인 시그널 체인 성능을 위해 전원 IC, 데이터 컨버터, 센서, 디지털 컨디셔닝 IC 등도 공급

3. 참고자료
- 데이터 시트는 아날로그닷컴
블랙핀 ADSP-BF592 제품 페이지 참조(www.analog.com/ADSP-BF592)
- 400-MHz 속도등급의
블랙핀 ADSP-BF592 안내동영상은 www.analog.com/ADSP-BF592_video 참조.
- DSP 지원과 관련해서는 ADI 온라인 기술지원 커뮤니티인
엔지니어존(EngineerZone™) http://ez.analog.com/community/dsp 참조.

4. 추천글


혁신 디자인에는 블랙핀 수준의 프로세싱이 필수적아나로그 디바이스의16/32비트 블랙핀 프로세서를 통해 엔지니어들은 디지털 시그널 프로세싱 전환의 이점을 취하고 통합된 아키텍처 상에서 프로세성을 제어하는 모든 애플리케이션의 인텔리전스, 성능, 연결성을 향상시킬 수 있다. 성능 대비 가격과 에너지 효율성이 매우 뛰어나며, 개발툴·애플리케이션·3자 지원 등을 통해 풍부한 통합 시스템을 구축한 만큼, 블랙핀은 산업·의학·자동차·보안·디지털홈엔터테인먼트·휴대용 기기 등 각종 혁신 애플리케이션 프로세서에 있어 최고의 선택이 될 것이다.

5. 아나로그 디바이스(Analog Devices)


혁신, 성능, 우수성은 아나로그 디바이스(Analog Devices)가 기술부문에서 오랫동안 최고 성장을 구가할 수 있는 초석이 되어왔다. 데이터 전환과 신호조정 기술을 선도하는 세계적인 기업으로 인정받고 있는 아나로그 디바이스는 거의 모든 종류의 전자기기를 공급하는 60,000개 이상의 고객을 보유하고 있다. 미 매사추세츠주 노우드에 본사를 두고, 전세계에 걸쳐 설계, 제조 시설을 운영하고 있다. 아나로그 디바이스의 주식은 종목기호 ADI로 뉴욕증권거래소 에 상장되어 있으며, S&P500지수에 포함되어 있다 (http://www.analog.com 참조).

ADI 트위터: http://www.twitter.com/ADI_News
링크드인 그룹(Linkedin Group): 아날로그 디바이스 블랙핀(Analog Devices Blackfin)

ADI 월간 기술잡지 아나로그 다이얼로그(Analog Dialogue) 구독: http://www.analog.com/library/analogDialogue/subscribe.html.

Blackfin, EZ-KIT Lite, VisualDSP++는 Analog Devices, Inc.의 등록상표이다. 기사에서 언급된 그 외 모든 상표의 소유권은 개별 소유권자에게 있다.

사진 및 멀티미디어 자료는 http://www.businesswire.com/cgi-bin/mmg.cgi?eid=6842552&lang=en을 참고할 것.

11. 연락처
시리얼시스템-박지한(블랙핀 FAE)