4. Sensor System
● Detect the environment to provide better
user experience
○ Accelerometer
○ Magnetometer
○ Light Sensor
○ Temperature Meter
● Application
○ Game feature
○ Rotate screen
○ E-compass
6. Sensor System
● API
○ Provide a interface to get system sensor manager
● Framework
○ Sensor manager service
○ Definitions of sensor, sensor event, event listener
● JNI
○ Link the framework layer and HAL
● HAL
○ The hardware foundation of Android
8. G-Sensor
System
Java Application Layer
Java Framework Layer
JNI
HAL
Linux Kernel
Setup the G-Sensor driver
9. Java Application Layer
● Implement a sensor application
○ Get sensor manager
○ Get a specific sensor
○ Register sensor event listener
...
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mAccerlerometer = mSensorManager.getDefautSensor(
Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer,
SensorManager.SENSOR_DELAY_GAME);
...
10. Java Application Layer
● Implement event listener
...
// Called when the sensor accuracy changed
public void onAccuracyChanged(int sensor, int accuracy){
// You can leave this function empty
}
...
// Called when the sensor value changed
public void onSensorChanged(SensorEvent event{
...
Log.d(TAG, "onSensorChanged==> sensor: " + sensor +
", x: " + event.values[0] +
", y: " + event.values[1] +
", z: " + event.values[2]);
…
}
...
11. G-Sensor
System
Java Application Layer
Java Framework Layer
JNI
HAL
Linux Kernel
Setup the G-Sensor driver
12. Java Framework Layer
● Sensor Manager
○ getDefautSensor(int type)
...
public Sensor getDefaultSensor( int type){
// just return the 1st sensor
List<Sensor> l = getSensorList(type);
return l.isEmpty() ? null : l.get(0);
}
…
○ registerListener(SensorEventListener listener,
Sensor sensor, int rate)
...
public boolean registerListener( (SensorEventListener listener, Sensor sensor, int rate){
// Another function was return
return registerListener(listener, sensor, rate, null);
}
…
13. Java Framework Layer
○ registerListener( (SensorEventListener listener,
Sensor sensor, int rate, Handler handler)
■ Delegate a listener on a sensor
■ Lock the listening thread before sensor enabled
■ Enable the sensor
■ Unlock the listening thread
■ Start polling
PS. Please refer to the Figure 7 in document
14. G-Sensor
System
Java Application Layer
Java Framework Layer
JNI
HAL
Linux Kernel
Setup the G-Sensor driver
15. JNI
● Sensor Manager
○ Mapped to the sensor manager in framework layer
■ nativeClassInit()
○ Provide the native function interface, e.g.:
■ sensors_enable_sensor()
■ sensors_data_poll()
PS. Please refer to the Figure 8 and Figure 9 in document
16. G-Sensor
System
Java Application Layer
Java Framework Layer
JNI
HAL
Linux Kernel
Setup the G-Sensor driver
17. Hardware Abstraction Layer
● Located in /hardware/STSensors/*
● Built on SensorBase.cpp
○ openInput(const char* inpuName)
○ Open input device for a given name when
construction
P.S. Please refer to the Figure 10 in document
18. Hardware Abstraction Layer
● AccSensor
○ #define INPUT_SYSFS_PATH_ACC "/sys/class/i2c-
adapter/i2c-4/4-0019/"
○ readEvents()
■ Get data from sensor event
■ Calibrate for real world
P.S. Please refer to the Figure 12 in document
19. G-Sensor
System
Java Application Layer
Java Framework Layer
JNI
HAL
Linux Kernel
Setup the G-Sensor driver
20. Linux Kernel
● User space communicate with kernel space
by system call
● Hardware drivers
● i2c protocol used
22. Linux Kernel
● i2c driver need implement four methods:
○ probe
■ Check the i2c functionality
■ Initialize the input status
■ Register the poll function
■ Create the sysfs interface
○ remove
■ Unregister the poll device
■ Shutdown the power
■ Remove sysfs interface
■ Free the memory
○ resume
○ suspend
P.S. Please refer the Figure 16 and Figure 17 in document
23. Linux Kernel
● lsm303dlh_acc_report_values()
static void lsm303dlh_acc_report_values(struct lsm303dlh_acc_data *acc, int *xyz)
{
struct input_dev *input = acc->input_poll_dev->input;
input_report_abs(input, ABS_X, xyz[0]);
input_report_abs(input, ABS_Y, xyz[1]);
input_report_abs(input, ABS_Z, xyz[2]);
input_sync(input);
}
P.S. Please refer to the Figure 18 and Figure 19 in document
24. G-Sensor
System
Java Application Layer
Java Framework Layer
JNI
HAL
Linux Kernel
Setup the G-Sensor driver
25. Setup G-Sensor Driver
● Let Linux kernel load the driver
○ innocomm_oracle_deconfig
○ KConfig
○ Makefile
P.S. Please refer to Figure 21 in document
● Setup regulator comsumer
○ board-oracle.c
P.S. Please refer to Figure 22 in document
● Setup the i2c between oracle board and chip
○ board-oracle-i2c.c
P.S. Please refer to Figure 23 in document
27. Conclusion
● A top-down view:
○ Java application layer
○ Java framework layer
○ HAL
○ Linux kernel
● E-Compass system is as same as the G-
Sensor system