본문으로 바로가기

ssize_t led_read(struct file *filp, char *user, size_t size, loff_t *pos)

{

int val;

unsigned int led_state = 0;


printk("RPi LED Read\n");


val = *gplev0;

if ((val & GPIO_23) != 0)

{

led_state |= (1);

}


val = copy_to_user(user, &led_state, size);

//실제 리얼 주소 피지컬 주소.

//이런식으로 반환값을 보내는 방식은 저수준 입출력 함수 read와 똑같다.

//커널이나 일반 유저의 주소는 서로 다르기 때문에 led_state는 실제 리얼 주소에 새겨진 변수 메모리고, 가상주소인 어플의 buf에 준다.

//윈도우는 따른 시스테믹한 개념이 적용되어있다.

//user 와 어플 쪽에 fd 와 대응 된다. 

return led_state;

}



//현재 우리가 커널을 장악했으니 우리가 왕이다. 즉, 맘대로 쓸 수 있도록 적용할 수 있따.




ssize_t led_write(struct file *filp, const char *user, size_t size, loff_t *pos)

{

unsigned int led_state = 0;

int val;

printk("RPi LED Write\n");


val = copy_from_user(&led_state, user, size);

//유저로 부터 4바이트 만큼 읽어서 led_state 에 쓴다. 라는 소리가 된다.

printk("led value: %d\n", led_state);


if (led_state & (1))

{

led_on();

}

else

{

led_off();

}


return led_state;

}