• <code id="zjelh"></code>

          <source id="zjelh"><form id="zjelh"></form></source><acronym id="zjelh"><form id="zjelh"><blockquote id="zjelh"></blockquote></form></acronym>

          1. <acronym id="zjelh"><form id="zjelh"></form></acronym>

            <input id="zjelh"><rt id="zjelh"></rt></input>
            <var id="zjelh"><rt id="zjelh"></rt></var>
            <source id="zjelh"><form id="zjelh"><del id="zjelh"></del></form></source>
            當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 >
            Andriod Sensor 架構深入剖析
            時間:2018-08-16作者:華清遠見

            1、Android sensor架構

            Android4.0系統內置對傳感器的支持達13種,它們分別是:加速度傳感器(accelerometer)、磁力傳感器(magnetic field)、方向傳感器(orientation)、陀螺儀(gyroscope)、環境光照傳感器(light)、壓力傳感器(pressure)、溫度傳感器(temperature)和距離傳感器(proximity)等。

            Android實現傳感器系統包括以下幾個部分:

            各部分之間架構圖如下:

            2、Sensor HAL層接口

            Google為Sensor提供了統一的HAL接口,不同的硬件廠商需要根據該接口來實現并完成具體的硬件抽象層,Android中Sensor的HAL接口定義在:hardware/libhardware/include/hardware/sensors.h

            對傳感器類型的定義:

            傳感器模塊的定義結構體如下:

            該接口的定義實際上是對標準的硬件模塊hw_module_t的一個擴展,增加了一個get_sensors_list函數,用于獲取傳感器的列表。

            對任意一個sensor設備都會有一個sensor_t結構體,其定義如下:

            每個傳感器的數據由sensors_event_t結構體表示,定義如下:

            其中,sensor為傳感器的標志符,而不同的傳感器則采用union方式來表示,sensors_vec_t結構體用來表示不同傳感器的數據,sensors_vec_t定義如下:

            Sensor設備結構體sensors_poll_device_t,對標準硬件設備hw_device_t結構體的擴展,主要完成讀取底層數據,并將數據存儲在struct sensors_poll_device_t結構體中,poll函數用來獲取底層數據,調用時將被阻塞定義如下:

            控制設備打開/關閉結構體定義如下:

            3、Sensor HAL實現(以LM75溫度傳感器為例子)

            (1)打開設備流程圖

            (2)實現代碼分析

            在代碼中含有兩個傳感器ADC電位器和LM75溫度傳感器,所以在sensor.c中,首先需要定義傳感器數組device_sensor_list[],其實就是初始化struct sensor_t結構體,初始化如下:

            定義open_sensors函數,來打開Sensor模塊,代碼如下:

            在這個方法中,首先需要為hw_device_t分配內存空間,并對其初始化,設置重要方法的實現。

            control_open_data_source()打開傳感器并使能設備:

            調用sensor__data_poll方法讀取數據:

            /*輪詢讀取數據*/
                    static int sensors__data_poll(struct sensors_data_context_t *dev, sensors_data_t * values)
                    {
                        int n;
                        int mag;
                        float temp;
                        char buf[10];
                        while (1) {
                        if(count % 3 == 2) // 讀取ADC值
                        {
                            if( read(dev->event_fd[0], &mag, sizeof(mag)) < 0)
                            {
                               LOGE("read adc error");
                            }else{ 
                            dev->sensors[ID_MAGNETIC_FIELD].magnetic.v[0] =(float)mag; 
                            LOGE("read adc %f\n",(float)mag);
                            *values = dev->sensors[ID_MAGNETIC_FIELD];
                            values->sensor = ID_MAGNETIC_FIELD;
                            count++;
                            }
                            usleep(500000);
                            return ID_MAGNETIC_FIELD;
                            }
                            else if(count%3 == 1) //讀取溫度傳感器值
                             {
                            memset(buf, 0 ,sizeof(buf));
                            if((n = read(dev->event_fd[1], buf, 10)) < 0)
                            {
                                LOGE("read temp error");
                                }else{
                                buf[n - 1] = '\0';
                                temp =(float) (atoi(buf) / 1000);
                                dev->sensors[ID_TEMPERATURE].temperature = temp;
                                LOGE("read temp %f\n",temp);
                                *values = dev->sensors[ID_TEMPERATURE];
                                values->sensor = ID_TEMPERATURE;
                                count++;
                            }
                                close(dev->event_fd[1]);
                                dev->event_fd[1]= open("/sys/bus/i2c/devices/0-0048/temp1_input", O_RDONLY);
                                usleep(500000);
                                return ID_TEMPERATURE;
                           }
                           else if(count%3 == 0) //讀取方向傳感器模擬值
                             {
                                LOGI("read orientation\n");
                                /* fill up data of orientation */
                                dev->sensors[ID_ORIENTATION].orientation.azimuth = x + 5;
                                dev->sensors[ID_ORIENTATION].orientation.pitch = y + 5;
                             &nbnbsp;  dev->sensors[ID_ORIENTATION].orientation.roll = z + 5;
                                *values = dev->sensors[ID_ORIENTATION];
                                values->sensor = ID_ORIENTATION;
                                count++;
                                x += 0.0001; y += 0.0001; z += 0.0001;
                                usleep (500000);
                                return ID_ORIENTATION;
                          }
                        }
                    }

            Sensor相關技術:

            Sensor框架結構分析

            Sensor HAL框架分析


            發表評論

            全國咨詢電話:400-611-6270,雙休日及節假日請致電值班手機:15010390966

            在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)

            企業培訓洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)

            Copyright 2004-2018 華清遠見教育集團 版權所有 ,京ICP備16055225號,京公海網安備11010802025203號

            yy4480影院