Android内核sysfs中switch类使用实例

来源:互联网 发布:pathfinder软件价格 编辑:程序博客网 时间:2024/04/24 15:56

原文地址;http://blog.csdn.net/kangear/article/details/37961151

Android内核sysfsswitch类使用实例

 

  终于在这个周末,可以干点自己想要干的事了。由我这个二流的内核驱动开发者来解析一下sysfs中的switch类。先推测一下来历,在普通的嵌入式Linux平台上,一般是各自为战,完全不需要遵循什么规则。在AndroidGoogle定义了一些潜移默化的规范,你可以完全不遵守。但是按照规则总归是好的。

         先从直观的来看一下/sys/class/switch类中都有些什么吧。

 

        首先可以看到实质是链接到了/sys/device/virtual/switch/目录,来看真面目:

 

        这里包含了4个bl是背光;h2w是耳机;hdmihdmi;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是要是编译过的。什么都不需要更改就可以顺利编译了。


附 完整简单例子代码:

[cpp] view plaincopy
  1. /* 
  2.  * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $ 
  3.  */  
  4. #include <linux/init.h>  
  5. #include <linux/module.h>  
  6. #include <linux/switch.h>  
  7. MODULE_LICENSE("Dual BSD/GPL");  
  8.   
  9. struct switch_dev sdev;  
  10.   
  11. static int hello_switch()  
  12. {  
  13.     int state, ret;  
  14.     sdev.name = "hello";  
  15.     ret = switch_dev_register(&sdev);  
  16.     if (ret < 0)  
  17.         return ret;  
  18.     state = 0;  
  19.     switch_set_state(&sdev,state);  
  20.     return 0;  
  21. }  
  22.   
  23. static int hello_init(void)  
  24. {  
  25.     printk(KERN_ALERT "Hello, world\n");  
  26.     if(hello_switch())  
  27.     {  
  28.         printk(KERN_ERR "failed to create hello switch\n");  
  29.         return -ENODEV;  
  30.     }  
  31.     return 0;  
  32. }  
  33.   
  34. static void hello_exit(void)  
  35. {  
  36.     printk(KERN_ALERT "Goodbye, cruel world\n");  
  37. }  
  38.   
  39. module_init(hello_init);  
  40. module_exit(hello_exit);  
0 0
原创粉丝点击