1

내 NEC 마이크로 컨트롤러는 8 비트 타이머 컨트롤러 레지스터를 가지고있다 - ioremap의 두 번째 매개 변수에 8을 전달해야합니까?ioremap()의 두 번째 매개 변수는 레지스터의 비트 수를 나타냅니다 (Linux)?

스펙을 읽은 후에, 나는 다음 특성을 알아야합니다.

Address |Function Register Name |Symbol |R/W Manipulatable Bits |Default Val 

FFFFF590H |TMP0 control register 0 |TP0CTL0 |R/W √ √     |00H 

따라서 타이머 레지스터 TP0CTL0이 매핑되는 실제 주소는 0xFFFFF590입니다.

이제이 레지스터를 다음과 같이 다시 매핑합니다. 더 많은 설명을 읽은 후에는 레지스터 크기가 8 비트임을 알아야합니다.

사양은 "TPnCTL0 레지스터는 TMPn의 작동을 제어하는 ​​8 비트 레지스터입니다."

이게 맞습니까? 0xFFFFF590으로 기본 주소를 사용하고 있으며이 레지스터의 크기는 8 비트입니다. 따라서 크기를 8 비트로 지정했습니다. 맞습니까? ioremap_nocache의 두 번째 매개 변수가 비트 크기입니까? 다음 API가 정확합니까? ioremap_nocache 함수에서 매개 변수를 올바르게 사용 했습니까?

void * tp0ctl0 = ioremap_nocache (0xFFFFF590, 8);

unsigned int val = ioread8(tp0ctl0); 
val = 2; 
iowrite8(val, tp0ctl0); 

여기 제발 올바른 -

다음으로, 나는이 다음을 수행하고있다. 내가 사용하는 마이크로 컨트롤러 정보를 기반으로 API를 올바르게 사용하고 있는지 여부에 대해 알려주십시오.

답변

2

ioremap_ *에 주어진 크기는 비트가 아닌 바이트 단위입니다. 이 함수의 목적은 물리적 주소 공간을 커널 가상 주소로 매핑하는 것이므로 0보다 크고 시스템 페이지 크기보다 작거나 같은 항목은 모두 동일합니다.

위에서 입력 한 정보가 있으면 ioremap_nocache(0xFFFFF590, 1)이 실제로 맞을 것입니다. 그러나 "1"대 "8"의 효과는 시스템 페이지 크기가 (둘 다 의심 할 여지없이) 둘 다보다 크기 때문에 동일합니다.