標籤:android switch
Android核心sysfs中switch類使用執行個體
終於在這個周末,可以幹點自己想要乾的事了。由我這個二流的核心驅動開發人員來解析一下sysfs中的switch類。先推測一下來曆,在普通的嵌入式Linux平台上,一般是各自為戰,完全不需要遵循什麼規則。在Android中Google定義了一些潛移默化的規範,你可以完全不遵守。但是按照規則總歸是好的。
先從直觀的來看一下/sys/class/switch類中都有些什麼吧。
首先可以看到實質是連結到了/sys/device/virtual/switch/目錄,來看真面目:
這裡包含了4個bl是背光;h2w是耳機;hdmi是hdmi;mic是麥克風 基本都屬於外接式的裝置,當然也可以不是比如bl。每個都包含了name/power/state/subsystem/uevent。都可以顧名思義,其中state一般是驅動中提供給使用者空間的狀態值。
那就以LDD3中的最簡單的Hello World例子來做一個switch例子:
添加不足20行代碼就已經實現了最簡的switch了,效果如下所示:
驅動中可以直接調用switch_set_state來設定不同的狀態值。對應地,應用程式層讀取這個就可以實現狀態擷取。
本文沒有詳細去說明switch實現細節,以實用的角度給出了一個完整的例子。當然如果對實現細節需要有瞭解的,可以看《switch_class》《android switch模組》。對於“驅動”想要告知使用者空間狀態的實現就可以採用這個了。
順便提一個編譯LDD3中驅動例子的小技巧: make KERNELDIR=~/4.2.2_r1/kernel/後邊這個是Android核心源碼路徑。當然路徑中的kernel是要是編譯過的。什麼都不需要更改就可以順利編譯了。
附 完整簡單例子代碼:
/* * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $ */#include <linux/init.h>#include <linux/module.h>#include <linux/switch.h>MODULE_LICENSE("Dual BSD/GPL");struct switch_dev sdev;static int hello_switch(){ int state, ret; sdev.name = "hello"; ret = switch_dev_register(&sdev); if (ret < 0) return ret; state = 0; switch_set_state(&sdev,state); return 0;}static int hello_init(void){printk(KERN_ALERT "Hello, world\n"); if(hello_switch()) { printk(KERN_ERR "failed to create hello switch\n"); return -ENODEV; }return 0;}static void hello_exit(void){printk(KERN_ALERT "Goodbye, cruel world\n");}module_init(hello_init);module_exit(hello_exit);
Android核心sysfs中switch類使用執行個體