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); } }