MPU6050帶字元驅動的i2c從裝置驅動2

2021-09-07 14:39:35 字數 3162 閱讀 6910

#include

#include

#include

#include

#include

#include

#include

#include

#include "log.h"

#include "mpu6050_reg.h"

module_license("gpl");

module_author("kevin liu");

struct axis_data ;

struct sub_sensor ;

struct temp_sensor ;

struct pwr_mgmt ;

struct mpu6050_data ;

enum ;

static float accel_sel[2] = , ,

, };

static float gyro_sel[2] = , ,

, };

static void mpu6050_enable(struct mpu6050_data *mpu6050)

static void mpu6050_disable(struct mpu6050_data *mpu6050)

static void mpu6050_reset(struct mpu6050_data *mpu6050)

/* * get gyro/accel/temprature data

* @type : 0 - gyro

* 1 - accel

* 2 - temprature */

static int mpu6050_read_data(struct mpu6050_data *mpu6050, int type)

if (type == 0 || type == 1)

for (i = 0; i < 3; i++)

} else if (type == 2)

for (i = 0; i < 1; i++) }

switch(type)

return 0; }

static int mpu6050_read_gyro(struct mpu6050_data *mpu6050)

static int mpu6050_read_accel(struct mpu6050_data *mpu6050)

static int mpu6050_read_temprature(struct mpu6050_data *mpu6050)

static void mpu6050_dump_all(struct mpu6050_data *mpu6050)

static void mpu6050_work(struct work_struct *work)

static int mpu6050_probe(struct i2c_client *client,

const struct i2c_device_id *id)

mpu6050 = kzalloc(sizeof(*mpu6050), gfp_kernel); //申請記憶體

if (!mpu6050) else

d("alloc ok\n");

mpu6050->client = client;

i2c_set_clientdata(client, mpu6050); //mmpu6050在clent中註冊

mutex_init(&mpu6050->lock);

mpu6050->delay_ms = 1000;

d("set ok\n");

init_delayed_work(&mpu6050->work, mpu6050_work);

d("work queue ok\n");

//init_delayed_work 初始化帶延時的工作佇列work,將mpu6050_work這個函式放到工作佇列中,然後等到呼叫schedule_delayed_work時執行。

version = i2c_smbus_read_byte_data(client, mpu6050_reg_who_am_i);

if (version != 0x68) else

d("version check ok\n");

// 讀id

mpu6050_reset(mpu6050);

mpu6050_enable(mpu6050);

schedule_delayed_work(&mpu6050->work,

msecs_to_jiffies(mpu6050->delay_ms));

//這裡呼叫非同步執行mpu6050_work這個函式。

return 0;

free_all:

kfree(mpu6050);

e("a oh!!!ooops...\n");

return -einval; }

static int mpu6050_remove(struct i2c_client *client)

static struct i2c_device_id mpu6050_ids = , ,

};static struct i2c_driver mpu6050_driver = ,

.class = i2c_class_hwmon,

.id_table = mpu6050_ids,

.probe = mpu6050_probe,

.remove = mpu6050_remove, };

/*上面定義i2c_driver結構體,整個檔案的目的就是實現i2c_driver結構體,並通過module_i2c_driver

註冊i2c驅動,當i2c_driver和i2c_client的name一樣,系統就對其進行probe,也就是執行mpu6050_probe函式。*/

module_i2c_driver(mpu6050_driver);

檢視整個驅動,實現了i2c_driver,掛載了i2c裝置獲得了i2c_cilent,使用了工作佇列,實現資料的延時連續讀取。這裡分別對mpu_client.c 和mpu_driver.c進行編譯得到mpu_client.ko,mpu_driver.ko。先載入mpu_client,再載入mpu_driver,得到:

可以看到驅動確實在工作,在不斷獲取陀螺儀資料,這裡並沒有將資料進行轉化。

i2c裝置驅動

1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...

Linux驅動之I2C裝置驅動

核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...

I2C裝置驅動流程

一 i2c裝置 驅動流程 1 i2c register board info 定義i2c 器件資訊 name,address,etc.static struct i2c board info initdata pi2c board info i2c register board info 1,arr...