Yeoyou....

Personal blogs

GPIO Porting

posted by 여경현

BIO_mb510x.h 파일

GPIO는 16비트 (16개의 출력) 가 세개로 이루어져있어…
레지스터 3개로 매핑되어있다. (GPIO_REG_0, GPIO_REG_1, GPIO_REG_2)
GPIO_REG_0 의 맨아래 lsb 부터… GPIO 0, 1, 2 … 숫자를 붙이면…
47까지의 GPIO번호가 나온다.

회로설계를 하면 각각의 GPIO를 어떤 용도로 사용될지가 결정된다.
이것을 SW에서 사용하기 위해… 그때마다
‘GPIO4번을 켠다’, GPIO6번을 끈다…
이런식으로 구현하게되면, 연관성도 떨어지고, 오류가 범할 확률이 커지며, 포팅이 어렵게 된다.
그래서 GPIO 4번… 이런 이름 대신 define을 하여 MUX_SW 등으로 치환하여 사용하게 되며,
이 치환하기위해 사용하는 파일이… BIO_mb510x.h 이다.

예를 들어 BIO_EAR_SW 에 관해 살펴보면

        BIO_OUT (BIO_EAR_SW_REG, BIO_EAR_SW_M, BIO_EAR_SW_HI_V);

와 같이 사용된다. BIO_OUT이라는 매크로를 사용하여…
EAR_SW에 해당하는 register (0,1,2 중하나)를 정하고, : BIO_EAR_SW_REG
어떤 비트를 제어할 것이냐에 따른 MASK… : BIO_EAR_SW_M (해당 비트만 1이고 나머지는 0)
그 비트를 셋할거냐 클리어할거냐? : BIO_EAR_SW_HI_V  1 또는 0
을 정해주면 비트 I/O를 제어할 수 있게 된다.

그럼 HW에 따라서 porting해야할 부분은 bio_mb510x.h 이다.
그럼, 용도에 맞게 수정하여 보자.

* 참고 BIO_OUT 매크로
BIO_OUT (io, mask, val)
1. bio_gpio[io].out_buf = (bio_gpio[io].out_buf & ~(mask)) | ((mask) & (val));
2. outpw(bio_gpio[io].out_addr, bio_gpio[io].out_buf);

이런식으로 되어있다.
1. 레지스터 번호에 따라 하나의 변수(배열)를 정해놓구… 출력할 상태에 따라 변수를 설정한다.
2. 설정된 변수 그대로 IO포트에 출력