sysfs 시스템
- sysfs를 통해 커널과 사용자 영역간 통신
1. 커널 자료구조에 대한 정보를 포함하는 메모리기반 파일 시스템이다.
2. sysfs는 커널에서 구조화된 디바이스 모델의 사용자 영역 쪽의 인터페이스다.
3. 디바이스 모델
* 점점 복잡해지는 디바이스를 수많은 새로운 시스템에 일반적인 추상화를 지원하기위해 표준화된 리눅스 커널의 모델
* 시스템의 모든 장치(버스포함)의 연결 상태를 트리구조로 관리
* 전원관리와 시스템 종료의 추상화
* 전원관리와 시스템 종료의 추상화
* netlink socket을 이용하여 사용자 영역과 통신하는 uevent
* 핫 플러그 디바이스 : USB처럼 시스템이 동작 중에 장치 연결을 지원
- sysfs는 시스템 시동 시점에 /sys 아래에 마운트 된다.
1. mount -t sysfs sysfs /sys
2. /sys 디렉토리는 다음과 같다.
$ls /sys
block bus calss dev devices firmware fs kernel module power
sysfc 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <linux/kernel.h> #include <linux/module.h> #include <linux/device.h> #include <linux/slab.h> #include <linux/platform_device.h> char value[1024]; static ssize_t show_value(struct device *dev, struct device_attribute *attr, char *buf) { return snprintf(buf, PAGE_SIZE, "%s\n", value); } static ssize_t store_value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { sscanf(buf, "%s", value); return strnlen(buf, PAGE_SIZE); } //dev_attr_value 변환 매크로 static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, show_value, store_value); static void sysfs_test_dev_release(struct device *dev) {} static struct platform_device the_pdev = { //생성할 디바이스 파일 이름을 지정 .name = "sysfs_test_device", .id = -1, .dev = { .release = sysfs_test_dev_release, } }; static int __init sysfs_test_init(void) { int err = 0; memset(value, 0, sizeof(value)); //the_pdev 를 커널에 등록한다. // /sys/device/platform/ 아래에 sysfs_test_device 디렉토리가 생성된다. err = platform_device_register(&the_pdev); if (err) { printk("platform_device_register error\n"); return err; } // /sys/의 해당 디렉토리 아래 디바이스파일 value(_name)파일 생성된다. err = device_create_file(&the_pdev.dev, &dev_attr_value); if (err) { printk("sysfs_create_file error\n"); goto sysfs_err; } return 0; sysfs_err: // 디렉토리 삭제 platform_device_unregister(&the_pdev); return err; } static void __exit sysfs_test_exit(void) { // 파일 삭제 device_remove_file(&the_pdev.dev, &dev_attr_value); // 디렉토리 삭제 platform_device_unregister(&the_pdev); } module_init(sysfs_test_init); module_exit(sysfs_test_exit); MODULE_LICENSE("GPL"); | cs |
출처 : 인지소프트웨어 기술포럼 ( 전유진 강사님 수업자료)
'임베디드 > 디바이스 드라이버' 카테고리의 다른 글
Misc 디바이스 드라이버1 (0) | 2017.12.26 |
---|---|
디바이스 드라이버 구조 (0) | 2017.12.26 |
GPIO 제어 (0) | 2017.12.26 |
PROCFS (0) | 2017.12.22 |
커널 모듈 구현 (0) | 2017.12.21 |