Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android內核sysfs中switch類使用實例

Android內核sysfs中switch類使用實例

編輯:關於Android編程

Android內核sysfs中switch類使用實例

  終於在這個周末,可以干點自己想要干的事了。由我這個二流的內核驅動開發者來解析一下sysfs中的switch類。先推測一下來歷,在普通的嵌入式Linux平台上,一般是各自為戰,完全不需要遵循什麼規則。在Android中Google定義了一些潛移默化的規范,你可以完全不遵守。但是按照規則總歸是好的。

先從直觀的來看一下/sys/class/switch類中都有些什麼吧。

vcq11srKx8G0vdO1vcHLL3N5cy9kZXZpY2UvdmlydHVhbC9zd2l0Y2gvxL/CvKOswLS/tNXmw+bEv6O6PC9wPgo8cD4gPGltZyBzcmM9"/uploadfile/Collfiles/20140720/20140720085527140.png" alt="\">

這裡包含了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 
#include 
#include 
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);


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved