1. 程式人生 > >mpu6050的安卓驅動分析

mpu6050的安卓驅動分析

一、前言

二、mpu的linux驅動層

三、mpu的HAL硬體抽象層

1.驅動原始檔目錄:hardware/invensense/libsensors/MPLSensor.cpp
這裡寫圖片描述
2.操作裝置檔案的關鍵部分
其中操作了四個裝置檔案:

mpu_int_fd = open("/dev/mpuirq", O_RDWR);
accel_fd = open("/dev/accelirq", O_RDWR);
timer_fd = open("/dev/timerirq", O_RDWR);
*sl_handle = (void*) open("/dev/mpu", O_RDWR);

SensorBase.cpp原始檔目錄:【 hardware/invensense/libsensors/SensorBase.cpp】

MPLSensor::MPLSensor() :
    SensorBase(NULL, NULL),
            mMpuAccuracy(0), mNewData(0),
            mDmpStarted(false),
            mMasterSensorMask(INV_ALL_SENSORS),
            mLocalSensorMask(ALL_MPL_SENSORS_NP), mPollTime(-1),
            mCurFifoRate(-1), mHaveGoodMpuCal(false), mHaveGoodCompassCal(false
), mUseTimerIrqAccel(false), mUsetimerIrqCompass(true), mUseTimerirq(false), mSampleCount(0), mEnabled(0), mPendingMask(0) { .......................... mpu_int_fd = open("/dev/mpuirq", O_RDWR); if (mpu_int_fd == -1) { ALOGE("could not open the mpu irq device node"
); } else { fcntl(mpu_int_fd, F_SETFL, O_NONBLOCK); //ioctl(mpu_int_fd, MPUIRQ_SET_TIMEOUT, 0); mIrqFds.add(MPUIRQ_FD, mpu_int_fd); mPollFds[MPUIRQ_FD].fd = mpu_int_fd; mPollFds[MPUIRQ_FD].events = POLLIN; } accel_fd = open("/dev/accelirq", O_RDWR); if (accel_fd == -1) { ALOGE("could not open the accel irq device node"); } else { fcntl(accel_fd, F_SETFL, O_NONBLOCK); //ioctl(accel_fd, SLAVEIRQ_SET_TIMEOUT, 0); mIrqFds.add(ACCELIRQ_FD, accel_fd); mPollFds[ACCELIRQ_FD].fd = accel_fd; mPollFds[ACCELIRQ_FD].events = POLLIN; } timer_fd = open("/dev/timerirq", O_RDWR); if (timer_fd == -1) { ALOGE("could not open the timer irq device node"); } else { fcntl(timer_fd, F_SETFL, O_NONBLOCK); //ioctl(timer_fd, TIMERIRQ_SET_TIMEOUT, 0); mIrqFds.add(TIMERIRQ_FD, timer_fd); mPollFds[TIMERIRQ_FD].fd = timer_fd; mPollFds[TIMERIRQ_FD].events = POLLIN; } data_fd = mpu_int_fd; if ((accel_fd == -1) && (timer_fd != -1)) { //no accel irq and timer available mUseTimerIrqAccel = true; //ALOGD("MPLSensor falling back to timerirq for accel data"); } ........................ }

mlsl_linux_mpu.c的原始檔目錄【hardware/invensense/mlsdk/platform/linux/mlsl_linux_mpu.c】

#define I2CDEV "/dev/mpu"
inv_error_t inv_serial_open(char const *port, void **sl_handle)
{
    INVENSENSE_FUNC_START;

    if (NULL == port) {
        port = I2CDEV;
    }
    *sl_handle = (void*) open(port, O_RDWR);
    if(sl_handle < 0) {
        /* ERROR HANDLING; you can check errno to see what went wrong */
        MPL_LOGE("inv_serial_open\n");
        MPL_LOGE("I2C Error %d: Cannot open Adapter %s\n", errno, port);
        return INV_ERROR_SERIAL_OPEN_ERROR;
    } else {
        MPL_LOGI("inv_serial_open: %s\n", port);
    }

    return INV_SUCCESS;
}

四、mpu的JNI層

五、mpu的 service層