PNP 기능을 플랫폼 드라이버라는 형태로 지원한다.

 

드라이버의 기본동작을 구현하기 위한 자료구조체

/usr/src/linux-3.19.4/include/linux/platform_device.h

 

174 struct platform_driver {
175     int (*probe)(struct platform_device *);
176     int (*remove)(struct platform_device *);
177     void (*shutdown)(struct platform_device *);
178     int (*suspend)(struct platform_device *, pm_message_t state);
179     int (*resume)(struct platform_device *);
180     struct device_driver driver;
181     const struct platform_device_id *id_table;
182     bool prevent_deferred_probe;
183 };

 

490 #define PLATFORM_NAME_SIZE  20
491 #define PLATFORM_MODULE_PREFIX  "platform:"
492    
493 struct platform_device_id {
494     char name[PLATFORM_NAME_SIZE];
495     kernel_ulong_t driver_data;
496 };  

 

 

보통 사용 예

 static struct platform_driver test_driver=

{

  .probe = test_probe,

  .remove= test_remove,

  .suspend= test_suspend

  .resume = test_resume,

  .driver ={

              .name = TEST_DEVICE_DRIVER_NAME,

  },

};

 

 

  • probe() 디바이스가 추가 되었을 때 처리하는 함수를 지정
  • remove() 디바이스가 제거 되었을 때 처리하는 함수를 지정
  • shutdown() 디바이스의 동작을 중지 시킬때 처리하는 함수
  • resume() 디바이스의 동작을 재시작 시킬 때 처리하는 함수
  • driver 구조체 내부의 name 필드만 보통 지정, 나머지 필드는 커널 내부에서 관리되면서 채워진다.
  • id_table  probe()함수가 호출되는 과정에서 해당 디바이스를 구별하고 처리하기 위한 내부 데이터를 지정하는 목적

 

 

 

플랫폼 드라이버 구조체 정보는 다음과 같은 함수로 커널에 등록되거나 제거된다.

  • int platform_driver_register(struct platform_driver *pdev);
  • void platform_dirver_unregister(struct platform_driver *pdev);

 

    platform_driver_register() 함수는  : pdev 정보를 커널 내부에 등록하기 위해서 사용되므로 보통 모듈 초기화 함수에서 사용된다. 반환값이 0이면 정상이다.

 


188 /*
189  * use a macro to avoid include chaining to get THIS_MODULE
190  */
191 #define platform_driver_register(drv) \
192     __platform_driver_register(drv, THIS_MODULE)
193 extern int __platform_driver_register(struct platform_driver *,
194                     struct module *);
195 extern void platform_driver_unregister(struct platform_driver *); 

 

 32 #ifdef MODULE
 33 extern struct module __this_module;
 34 #define THIS_MODULE (&__this_module)
 35 #else
 36 #define THIS_MODULE ((struct module *)0)
 37 #endif

 

다른버전 ----4.0.2

/usr/src/linux-4.0.2/drivers/base/platform.c

 

 

 

 

 

 

 

 

참조 : B003_디바이스 드라이버 모듈 (유영창)

 

 

 

'리눅스커널 > Device Driver' 카테고리의 다른 글

USB 인사이드 muosys.egloos.com  (0) 2016.05.16
PS/2 키보드 LED제어  (0) 2015.05.13
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
IOCTL  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11

+ Recent posts