arm-linux 문자 장치 IO 제어

ioremap(cookie, size)을 사용하여 드라이버 생성

ioremap 매크로는 asm/io.h에 정의되어 있습니다.

예:IMX6U_CCM_CCGR1 = ioremap(CCM_CCGR1_BASE, 4);

iounmap을 사용하여 드라이버 등록 취소

2. ioremap() 관련 함수 분석

I/O 메모리 리소스의 물리적 주소를 코어 가상 주소에 매핑한 후 이론적으로 말하면 RAM 읽기 및 쓰기와 같이 I/O 메모리 리소스를 직접 읽고 쓸 수 있습니다. 드라이버의 크로스 플랫폼 이식성을 보장하기 위해 코어 가상 주소에 대한 포인터를 사용하는 대신 Linux의 특정 기능을 사용하여 I/O 메모리 리소스에 액세스해야 합니다 .

I/O 읽기 및 쓰기 기능은 다음과 같습니다.

a -- 쓰기()

writel()은 메모리 매핑된 I/O 공간에 데이터를 쓰고 wirtel()은 32비트 데이터(4바이트)를 I/O에 씁니다.

原型: void writel (unsigned char data , unsigned int addr )

b -- readl()

readl()은 메모리 매핑된 I/O 공간에서 데이터를 읽고 readl은 I/O에서 32비트 데이터(4바이트)를 읽습니다.
프로토타입: unsigned char readl(unsigned int addr)

예:

/* 2. GPIO1 클럭 활성화*/
    val = readl(IMX6U_CCM_CCGR1);
    val &= ~(3 << 26); /* 이전 설정 지우기*/
    val |= (3 << 26); /* 새 값 설정 값 */
    writel(val, IMX6U_CCM_CCGR1);

readl() 및 writel()은 서로 협력하여 led 등의 깜박임을 실현할 수 있습니다.

void led_switch(u8 sta)
{     u32 val = 0;     if(sta == LEDON) {         val = readl(GPIO1_DR);//GPIO1_DR 레지스터 값 읽기         val &= ~(1 << 3); //Register For 값, 1을 왼쪽으로 3비트 이동한 값을 반전한 다음 val과 AND한 다음 val에 할당         write(val, GPIO1_DR); // val을 GPIO1_DR 레지스터에 쓰기     } else if(sta == LEDOFF ) {         val = readl (GPIO1_DR);         val|= (1 << 3);             쓰기(val, GPIO1_DR);     }     }











 

Supongo que te gusta

Origin blog.csdn.net/L1153413073/article/details/125426908
IO:
Recomendado
Clasificación