Android Sensor感應器系統架構初探

來源:互聯網
上載者:User

1. 體繫結構

2. 資料結構

3. 四大函數

本文以重力感應器裝置G-sensor為例探索Android的各階層。

1. 體繫結構

    Android的體繫結構可分為4個層次。

  • 第一層次  底層驅動層,包括標準Linux,Android核心驅動,Android相關裝置驅動,G-sensor的裝置驅動程式即存在於此
  • 第二層次 Android標準C/C++庫,包括硬體抽象層,Android各底層庫,本地庫,JNI
  • 第三層次 Android Java Framwork架構層
  • 第四層次 Java應用程式

本文重點關注硬體抽象層,JNI以及Framework。

1.1 硬體抽象層

      硬體抽象層通過例如open(), read(), write(), ioctl(), poll()等函數調用的方式,與底層裝置驅動程式進行互動,而這些函數調用是底層裝置驅動程式事先準備好的。

      用於互動的關鍵是檔案描述符fd,fd通過open()開啟G-sensor裝置節點而得到,即 fd = open ("/dev/bma220", O_RDONLY);而/dev/bma220這個裝置節點是在底層裝置驅動中註冊完成的。

      其他的函數調用如read(), write()等都通過該檔案描述符fd對G-sensor裝置進行操作。

1.2 JNI (Java Native Interface)

      JNI層可以認為是整個體繫結構中的配角,概括地講,它就完成了一項任務,既實現從C++語言到Java語言的轉換。JNI層為Java Framework層提供一系列介面,而這些介面函數的具體實現中,利用例如module->methods->open(), sSensorDevice->data_open(), sSensorDevice->poll()等回呼函數與硬體抽象層進行互動。而這些open(), poll()回呼函數在硬體抽象層中具體實現。

1.3 Java Framework

      Framework層提供各種類和類的對象,可作為系統的守護進程運行,也可供上層應用程式的使用。

      例如類SensorManager,它作為系統的守護進程在初始化的時候開始運行,其子類SensorThread中的子類SensorThreadRunnable通過sensors_data_poll()實現了對G-sensor資料的輪訓訪問,而sensors_data_poll()通過JNI層轉換到硬體抽象層去具體實現poll()。

2 資料結構

     一般境況下,硬體抽象層對硬體的描述都分為control和data兩大類。

2.1 sensors_control_context_t

struct sensors_control_context_t {
    struct sensors_control_device_t device;

    int fd;
};

struct sensors_control_device_t {
    struct
hw_device_t common;
    int (*open_data_source)(struct sensors_control_device_t *dev);
    int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled);
    int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);

    int (*wake)(struct sensors_control_device_t *dev);
};

2.2 sensors_data_context_t

struct sensors_data_context_t {
    struct sensors_data_device_t device;

    int fd;
};

struct sensors_data_device_t {
    struct hw_device_t common;

    int (*data_open)(struct sensors_data_device_t *dev, int fd);
    int (*data_close)(struct sensors_data_device_t *dev);
    int (*poll)(struct sensors_data_device_t *dev,
            sensors_data_t* data);
}

struct hw_device_t {
    uint32_t tag; uint32_t version;

    struct hw_module_t* module;

    int (*close)(struct hw_device_t* device);
};

struct hw_module_t {
    uint32_t tag; uint16_t version_major; uint16_t version_minor;

    const char *id; const char *name; const char *author;

    struct hw_module_methods_t* methods;
};

struct hw_module_methods_t {
    int (*open)(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device);
};

下文將通過對(*open), (*open_data_source), (*data_open)和(*poll)的程式碼分析,探索Android的各層次架構。

3 四大函數

3.1 module->methods->open()

1) Framework

    SensorService作為系統守護進程運行,其類的建構函式實現_sensors_control_init()。

2) JNI

    為_sensors_control_init()提供介面android_init(),並執行回呼函數module->methods->open();

3) 硬體抽象層

    具體實現(*open),該函數為所有G-sensor回呼函數的指標賦值。

3.2 sSensorDevice->open_data_source()

1) Framework

    SensorService作為系統守護進程運行,其類的一個公有成員ParcelFileDescriptor通過實現_sensors_control_open()得到裝置的檔案描述符。

2) JNI

    為_sensors_control_open()提供介面android_open(),並執行回呼函數sSensorDevice->open_data_source();

3) 硬體抽象層

    具體實現(*open_data_source),該函數通過開啟G-sensor的裝置節點得到檔案描述符fd = open ("/dev/bma220", O_RDONLY);

4) 裝置驅動層

    通過misc_register()對G-sensor裝置進行註冊,建立裝置節點。

3.3 sSensorDevice->data_open()

1) Framework

    SensorManager作為系統守護進程運行,其子類SensorThreadRunnable的行為函數run()實現sensors_data_open()。

2) JNI

    為sensors_data_open()提供介面sensors_data_open(),並執行回呼函數sSensorDevice->data_open();

3) 硬體抽象層

    具體實現(*data_open),該函數的功能就是將已經得到的檔案描述符fd複製一份到sensors_data_context結構體中的dev->fd,以便為處理資料的回呼函數如(*poll)使用。

3.4 sSensorDevice->poll()

 

1) Framework

    SensorManager作為系統守護進程運行,其子類SensorThreadRunnable的行為函數run()實現sensors_data_poll(values, status, timestamp),其目的是通過此函數得到從底層傳上來的有關G-sensor的資料values, status和timestamp,再通過此類的一個行為函數listener.onSensorChangedLocked(sensorObject, values, timestamp, accuracy);為上層應用程式提供了得到G-sensor裝置資料的介面函數。

2) JNI

    為sensors_data_poll()提供介面sensors_data_poll(),並執行回呼函數sSensorDevice->poll(sSensorDevice, &data);其中,得到的data就是從底層傳上來的G-sensor資料,然後通過的方式將data中對應的資料分別賦給values, status和timestamp。

 

3) 硬體抽象層

    具體實現(*poll),該函數通過ioctl()實現與底層驅動程式的互動。

    ioctl(dev->fd, BMA220_GET_ORIENTATION, &orient_value);

    其中,dev->fd即剛才由(*data_open)得到的檔案描述符,BMA220_GET_ORIENTATION為ioctl的一個命令,具體實現由底層驅動程式完成,orient_value即得到的G-sensor資料,它通過的方式將相對應的資料賦給了data結構體中的values, status和time,從而最終實現了從底層到上層的資料通訊。

4) 裝置驅動層

    與硬體抽象層互動的read(), write(), ioctl()函數由裝置驅動實現。以ioctl()的一條命令BMA220_GET_ORIENTATION為例,

通過bma220_get_orientation(data)得到G-sensor的資料data,然後將其從核心空間上傳到使用者空間的arg.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.