Kernel에서 내가 원하는 부분정보를 얻고, 설정을 변경하기 위해서 테스트용 sys filesystem을 추가구현해보도록 한다.
- Kernel 의 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/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 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
http://infoarts.tistory.com/21
https://www.kernel.org/doc/Documentation/i2c/dev-interface
- 기본 CHARTER DRIVER 예제들
http://www.opensourceforu.com/2011/08/io-control-in-linux/
- Udev Rule 관련설정
http://www.troot.co.kr/tc/1958