kernel에서 user level로 uevent 보내는 법 (how to send an uevent to the user space) Linux



아래 코드는 native에서 uevent를 처리하는 example 입니다.



1. kernel level (f_accessory.c file 참고)


/* file operationsfor /dev/usb_accessory */

static const structfile_operations acc_fops = {

          .owner = THIS_MODULE,

          .read = acc_read,

          .write = acc_write,

          .unlocked_ioctl = acc_ioctl,

          .open = acc_open,

          .release = acc_release,

};

 

 

static structmiscdevice acc_device = {

          .minor = MISC_DYNAMIC_MINOR,

          .name = "usb_accessory",

          .fops = &acc_fops,

};

 

 

static voidacc_start_work(struct work_struct *data)

{

          char *envp[2] = { "ACCESSORY=START", NULL };

          kobject_uevent_env(&acc_device.this_device->kobj, KOBJ_CHANGE, envp);

}



2. user level (uevent observer 코드)


int main()

{

   event_loop();

   return 0;

}

 

 

static voidevent_loop(void)

{

   int len = 0;

   static char udata[4096];

    memset(udata,0, sizeof(udata));

 

   uevent_init();

 

   while (1) {

       len = uevent_next_event(udata, sizeof(udata) - 2);    // eventwaitnig  (mes is filled in the 'udata')

 

                               // "USB_STATE=DISCONNECTED" 등의 string을 받음

 

       handle_uevent(udata);                                

                               // 여기서 string parsing 한 후 원하는 처리 수행

                               // Google vocie service 실행intent 발생

    }

}

 

static voidhandle_uevent(const char* udata)

{

    ...

    처리코드 (AndroidIntent 발생 시키는 코드 필요)

    인터넷에서 AndroidIntent를 발생시키는 예제 검색해서 참고 (Intent의 대상은 Google voice service)

    ...

}



덧글

댓글 입력 영역