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;
}
'마이 스토리 > 내용 정리중인 글들..' 카테고리의 다른 글
20151116 - TranslateMessage 커서 제어 등, 메뉴만들기 등 3일차 (0) | 2015.11.16 |
---|---|
20151112 - WinAPI 기본형 배우기 (0) | 2015.11.12 |
20151106 - 커널의 모듈에 대해서 (0) | 2015.11.06 |
20151106 - 커널에 대하여 (0) | 2015.11.06 |
20151105 - 커널 예제. (0) | 2015.11.05 |