• Android内核sysfs中switch类使用实例


    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是要是编译过的。

    什么都不须要更改就能够顺利编译了。


    附 完整简单样例代码:

    /*
     * $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
    ");
        if(hello_switch())
        {
            printk(KERN_ERR "failed to create hello switch
    ");
            return -ENODEV;
        }
    	return 0;
    }
    
    static void hello_exit(void)
    {
    	printk(KERN_ALERT "Goodbye, cruel world
    ");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    


  • 相关阅读:
    用户验证之自定义身份验证
    再谈CLR:查看程序集的依赖关系
    关于私钥加密、公钥加密、签名在生活中的场景
    MOSS 2010服务器对象模型(Object Model)
    用户身份验证之Windows验证
    由object不能比较引发的问题
    再谈CLR: .NET 4.0新功能:Mscoree.dll + Mscoreei.dll=更少的Reboot (上)
    再谈CLR:事件定义
    WPF:如何为程序添加splashScreen?
    通过反射得到类型的所有成员
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6803429.html
Copyright © 2020-2023  润新知