12/16/2014

Linux sys file system Simple 예제 (커널테스트용으로 작성)

1. Kernel 내부의 sys filesystem 로 Debug  

Kernel에서 내가 원하는 부분정보를 얻고,  설정을 변경하기 위해서 테스트용 sys filesystem을 추가구현해보도록 한다.

  • Kernel 의 sys file system module 의 예제 
링크된 sys file system module의 예제를 참고하여 기본구현
sysfs_create_group를 unregister 하기 위해서 sysfs_remove_group 써야한다고 하는데 이부분은 미확인
  http://www.linuxquestions.org/questions/linux-embedded-and-single-board-computer-78/sysfs-class-registration-942098/


상위소스와 같이 각각의 show_xx 함수와 store_xx 함수를 정의하여 attribute를 구성하여 추가한다.

  • device_attribute 로 sys file system 확장 (SDCard)
/sys/block/sdx/device/scsi_disk/xxx/cache_type
/sys/block/sdx/device/scsi_disk/xxx/FUA

/*
 *  /sys/device  이외에도 다양하게 제공 bus_attribute
 *
 *  sys filesystem의 portstate 추가 
 *      read  function : xx_show_xx   이미 이함수들이 추가되어있음 
 *      write function : xx_store_xx  이미 이함수들이 추가되어있음 
 */

static struct device_attribute sd_disk_attrs[] = {
 __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, sd_store_cache_type),
 __ATTR(FUA, S_IRUGO, sd_show_fua, NULL),
 __ATTR(allow_restart, S_IRUGO|S_IWUSR, sd_show_allow_restart, sd_store_allow_restart),
 __ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop, sd_store_manage_start_stop),
 __ATTR(protection_type, S_IRUGO, sd_show_protection_type, NULL),
 __ATTR(protection_mode, S_IRUGO, sd_show_protection_mode, NULL),
 __ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL),
 __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL),
 __ATTR_NULL,

};

/*
 *  상위구현 된 부분에 본인이 추가할 부분 추가  
 *  sd_show_cache_type  sd_store_cache_type
 *   
 */
.........
.........

static struct class sd_disk_class = {
 .name  = "scsi_disk",
 .owner  = THIS_MODULE,
 .dev_release = scsi_disk_release,
 .dev_attrs = sd_disk_attrs,
};


MMC_DEV_ATTR 와  DEVICE_ATTR 로 변경되어 사용됨
  https://elixir.bootlin.com/linux/v4.10.17/source/drivers/mmc
  https://elixir.bootlin.com/linux/v4.10.17/source/drivers/mmc/core/sd.c


  • class_attribute를 이용하여 sys filesytem 확장 
/sys/class/rtl8370m/portstate 추가

/*
 *  /sys/class/rtl8370m/portstate
 *
 *  sys filesystem의 portstate 추가 
 *      read  function : portstate_show
 *      write function : portstate_store
 */
static struct class_attribute class_attr[] = {
 __ATTR(portstate, S_IWUSR | S_IRUGO, portstate_show, portstate_store),
 __ATTR_NULL
 };

/*
 * 별도로 본인이 보고 싶고 설정하고 싶은 두 함수를 설정
 *
 */

static ssize_t portstate_show(struct class *cls, char *buf)
{
   char *x[] = {"Enabled", "Disabled"}; 
   printk("portstate_show\n");
   return sprintf(buf, "%s\n", x[0]);
}

static ssize_t portstate_store(struct class *cls, const char *buf, size_t count)
{
   printk("portstate_store \n");
   return 1;
}

.......

/*  /sys/class/rtl8370m    */

static struct class rtl8370m_drv = {
 .name = "rtl8370m",    
 .owner = THIS_MODULE,
 .class_attrs =(struct class_attribute *) &class_attr,
};



 
  • sys file 을 이용한 GPIO 
  https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
  http://infoarts.tistory.com/21
  https://www.kernel.org/doc/Documentation/i2c/dev-interface


  • 기본 CHARTER DRIVER 예제들
  http://parkjunehyun.tistory.com/m/post/248
  http://www.opensourceforu.com/2011/08/io-control-in-linux/


  • Udev Rule 관련설정
  https://kernel.googlesource.com/pub/scm/linux/hotplug/udev/+/1ed38f41749dde482e164e692255b60c38b5d876/etc/udev/rules.d/60-persistent-storage.rules
  http://www.troot.co.kr/tc/1958