1. 程式人生 > >MPU6050帶字元驅動的i2c從裝置驅動1

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

開幹: 1、閒言碎語 這個驅動,越寫覺的越簡單,入門難,入門之後感覺還好。Linux開發還是比較友好的。 2、編寫MPU6050帶字元驅動的i2c從裝置驅動 要實現的功能就是,將MPU6050作為字元驅動,在應用層,對其進行讀資料。實現簡單的功能。在前面的分析和實踐中,可以看到實現字元驅動主要是實現file_operation中的方法,註冊初始化cdev,讓cdev和file_opration產生聯絡,字元驅動的初始化通過module_init來宣告。實現i2c從裝置驅動,主要是i2c_client和i2c_driver通過名字匹配,然後呼叫probe函式對裝置進行初始化。那麼,實現字元驅動的i2c從裝置驅動,其實就是在i2c從裝置驅動中新增字元驅動操作方法,從而在/dev中產生裝置節點,讓使用者可以通過Linux application的API對其進行操作。 本文實現了帶字元驅動的i2c從裝置驅動,然後編寫了使用者層測試程式,測試結果正確。下面對部分程式碼進行分析。 定義i2c_driver,file_operations, static struct i2c_driver mpu6xxx_driver = { .driver = { .name = "mpu6xxx", .owner = THIS_MODULE, }, .class = I2C_CLASS_HWMON, .id_table = mpu6xxx_ids, .probe = mpu6xxx_probe, .remove = mpu6xxx_remove, }; 主要實現其中的probe函式。 struct file_operations mpu6xxx_fops = { owner : THIS_MODULE, unlocked_ioctl : mpu6xxx_ioctl, open : mpu6xxx_open, release : mpu6xxx_release, }; 主要實現其中的ioctl函式。 probe函式實現: static int mpu6xxx_probe(struct i2c_client *client, const struct i2c_device_id *id){ u16 version; int result,retval = -1; struct mpu6xxx_data *mpu6xxx; dev_t dev; printk(KERN_DEBUG "mpu6xxx driver probe... \n"); if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){ retval = -EINVAL; goto failed; } //核查i2c驅動 mpu6xxx = kzalloc(sizeof(struct mpu6xxx_data),GFP_KERNEL); //分配使用者資料 if(!mpu6xxx) { retval = -ENOMEM; goto failed; } memset(&mpu6xxx->gyro,0,sizeof(struct sub_sensor)); memset(&mpu6xxx->accel,0,sizeof(struct sub_sensor)); mutex_init(&mpu6xxx->lock); mpu6xxx->client = client; i2c_set_clientdata(client,mpu6xxx); //用來在驅動中獲取資料 this_client = client; version = i2c_smbus_read_byte_data(client,MPU6050_REG_WHO_AM_I); if(version != 0x70) { printk("error retval %d , version %.2x \n",retval , version); retval = -2; goto failed; } //檢查version result = alloc_chrdev_region(&dev,this_major,1,"mpu6xxx"); if(result < 0) { retval = result; goto failed; } this_major = MAJOR(dev); cdev_init(&mpu6xxx->cdev,&mpu6xxx_fops); mpu6xxx->cdev.owner = THIS_MODULE; result = cdev_add(&mpu6xxx->cdev,dev,1); if(result) { retval = result; goto failed; } mpu_cls = class_create(THIS_MODULE,"mpu6xxx"); if(IS_ERR(mpu_cls)) { retval = -3; goto failed; } mpu_device = device_create(mpu_cls,NULL,dev,NULL,"mpu6xxx"); if(IS_ERR(mpu_device)) { class_destroy(mpu_cls); } //註冊cdev,以及在/dev中產生節點 mpu6xxx_reset(mpu6xxx); mpu6xxx_disable(mpu6xxx); retval = 0; printk(KERN_DEBUG "mpuxxx probe succeed...\n"); return retval; failed: return retval; }; ioctl實現: static int mpu6xxx_ioctl(struct file *file, unsigned int cmd,unsigned long arg) { int re = -1; void __user *argp = (void __user *)arg; struct mpu6xxx_data *mpu6xxx = i2c_get_clientdata(this_client); printk("ioctl ... cmd %d mpucmd %d BUFFERSIZE %d\n",cmd,MPU_IOCTL_GETGYRO,BUFFERSIZE); switch(cmd) { case MPU_IOCTL_GETGYRO: mutex_lock(&(mpu6xxx->lock) ); //通過互斥操作來避免頻繁讀寫 re = mpu6xxx_read_data(mpu6xxx,0); if(re != 0) return re; printk("x : %d \n", mpu6xxx->gyro.x.value); if(copy_to_user(argp,&mpu6xxx->gyro,sizeof(struct sub_sensor))) //將資料拷貝到使用者空間 { printk("failed copy data .. \n"); mutex_unlock(&mpu6xxx->lock); return -EFAULT; } printk("ioctl succed...\n"); mutex_unlock(&mpu6xxx->lock); break ; case MPU_IOCTL_GETACCEL: mutex_lock(&(mpu6xxx->lock) ); re = mpu6xxx_read_data(mpu6xxx,1); if(re != 0) return re; if(copy_to_user(argp,&mpu6xxx->accel,sizeof(struct sub_sensor))) { mutex_unlock(&(mpu6xxx->lock) ); printk("failed copy data .. \n"); return -EFAULT; } mutex_unlock(&(mpu6xxx->lock) ); break; default: break; } return 0; } 驅動載入結果:
應用層程式碼結果:
在動6050時,資料會變動。並且資料大小正常。

相關推薦

MPU6050字元驅動i2c裝置驅動1

開幹: 1、閒言碎語 這個驅動,越寫覺的越簡單,入門難,入門之後感覺還好。Linux開發還是比較友好的。 2、編寫MPU6050帶字元驅動的i2c從裝置驅動 要實現的功能就是,將MPU6050作為字元驅動,在應用層,對其進行讀資料。實現簡單的功能。在前面的分析和實踐中,可以看到實現字元驅動主要是實

MPU6050字元驅動i2c裝置驅動2

#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/mutex.

i2c驅動程式全面分析,adapter驅動程式到裝置驅動程式

開發板    :mini2440 核心版本:linux2.6.32.2 驅動程式參考:韋東山老師畢業班i2c 內容概括:    1、adapter client 簡介2、adapter 驅動框架      2.1 裝置側2.2 驅動側         2.2.1 probe

Linux下SPI裝置驅動的編寫

 SPI(Serial Peripheral Interface) 是一個同步的四線制序列線,用於連線微控制器和感測器、儲存器及外圍裝置。三條訊號線持有時鐘訊號(SCLK,經常在10MHz左右)和並行資

Linux功耗管理(25_Linux電源管理(14)_裝置驅動的角度看電源管理)

1. 前言 相信工作稍微久一點的linux驅動工程師都深有體會: 在舊時光裡,實現某一個裝置的電源管理功能,是非常簡單的一件事情。大多數裝置都被抽象為platform裝置,driver只需要提供suspend/resume/shutdown等回撥函式,並註冊到kerne

網路協議棧分析——裝置驅動到鏈路層

對應我們上面的網絡卡驅動分析。接收到的資料是存放在data至tail之間的區域。 Skb通常還有常用的幾個函式,一一列舉分析如下: struct sk_buff *alloc_skb(unsigned int size,int gfp_mask) 分配儲存空間為sixe的skb,記憶體分配級別為gf

字元裝置驅動與塊裝置驅動、網路裝置驅動的區別

在Linux作業系統下有3類主要的裝置檔案型別:塊裝置、字元裝置和網路裝置。這種分類方法可以將控制輸入/輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指存取時沒有快取的裝置。典型的字元裝置包括滑鼠、鍵盤、序列口等。字元裝置與塊裝置的主要區別是:在對字元裝置發出讀/

[轉]字元裝置驅動和塊裝置驅動的區…

    系統中能夠隨機(不需要按順序)訪問固定大小資料片(chunks)的裝置被稱作塊裝置,這些資料片就稱作塊。最常見的塊裝置是硬碟,除此以外,還有軟盤驅動器、CD-ROM驅動器和快閃記憶體等等許多其他塊裝置。注意,它們都是以安裝檔案系統的方式使用的——這也是塊裝置的一般訪問方式。   另一種基本的裝置型

(二)USB驅動程式_USB裝置驅動(Host)

USB裝置驅動(Host) 深入,並且廣泛 -沉默犀牛 有了第一篇文章的基礎,我們這篇文章來看一下USB裝置驅動的原始碼。與其他的Driver一樣,USB的driver也表現為一個結構體:struct usb_driver 驅動整體結構 在編寫新的USB

STM32F1與I2C裝置通訊無應答?

最近做了STM32F103與DAC的I2C通訊,起先使用的是硬體I2C來驅動,按照時序寫好程式通訊正常,但由於電路板需求,需要將I2C的SCL和SDA線拉長,導致硬體I2C通訊經常掛死,於是考慮採用模擬I2C,(硬體I2C和模擬I2C的程式在我另外兩篇部落格上有),但是也經常掛死,最後終於找到原因,

Linux驅動開發04:塊裝置驅動和網路裝置驅動

介紹 因為塊裝置驅動和網路裝置驅動實際中用得較少,所以只給出驅動模板,我也沒有具體測試,等到實際用到是再研究吧,溜了溜了。 塊裝置驅動模板 struct xxx_dev { int size; struct request_q

Linux-Flash驅動(2)-塊裝置驅動例項分析

在上一節課中,我們在記憶體中劃分出512kB作為一個塊裝置,並對它實現讀寫的操作。現在我們來具體分析這段程式碼。 #include <linux/module.h> #include <linux/moduleparam.h> #include

Linux驅動開發----塊裝置驅動(記憶體模擬)Tiny6410

寫了好久的字元裝置驅動,是時候看下塊裝置驅動程式設計方法了,塊裝置驅動和字元裝置不同,字元裝置是直接和虛擬檔案系統進行互動,而塊裝置驅動則是通過塊緩衝/排程層間接和虛擬檔案系統互動;塊裝置驅動資料訪問都是以塊為單位;多個塊I/O需要組成一個請求佇列,這個功能是塊緩衝/排程層

Linux 裝置驅動開發 —— platform裝置驅動應用例項解析

       前面我們已經學習了platform裝置的理論知識Linux 裝置驅動開發 —— platform 裝置驅動 ,下面將通過一個例項來深入我們的學習。 一、platform 驅動的工作過程         platform模型驅動程式設計,需要實現platfor

平臺裝置驅動和混雜裝置驅動

1. 平臺裝置驅動 在linux2.6以後的裝置驅動模型中,只關心裝置、驅動和匯流排這三個實體,匯流排將裝置驅動繫結。在向系統註冊一個裝置時會由匯流排匹配對應的驅動,相反當向系統註冊一個驅動時由匯流排匹配出對應的裝置。 在linux裝置和驅動通常要掛接在某條總線上,對於II

Linux應用層讀寫i2c裝置(eeprom)

/***************************************************************************** i2c讀函式,引數1:從裝置地址,引數2:暫存器地址,引數3:讀取資料緩衝區,引數4:讀取資料大小

linux驅動之塊裝置驅動

塊裝置驅動的系統架構 VFS: 是對各種具體檔案系統的一種封裝,使用者程式訪問檔案提供統一的介面。例如: EXT2,FAT,NFS等 系統架構—Cache: 當用戶發起檔案訪問請求的時候,首先回到Cache中定址檔案是否被快取了,如果在Ca

【linux】驅動-6-匯流排-裝置-驅動

[toc] --- ## 前言 ## 6. 匯流排-裝置-驅動 **匯流排-裝置-驅動** 又稱為 **裝置驅動模型**。 ### 6.1 概念 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-2021033012262324

【linux】驅動-7-平臺裝置驅動

[toc] --- ## 前言 區分**裝置驅動模型**和**平臺裝置驅動模型**。 **裝置驅動模型** 可以理解為 **匯流排、裝置、驅動**。 **平臺裝置驅動模型** 就是那些 Linux 核心管理沒有物理匯流排(*即是不需要特殊時序控制的裝置*)(*也是Linux核心沒有自動建立相應驅動匯流

MPU6050字符驅動i2c設備驅動1

val 添加 space res add 操作方法 驅動 move 初始化 開幹: 1、閑言碎語 這個驅動,越寫覺的越簡單,入門難,入門之後感覺還好。Linux開發還是比較友好的。 2、編寫MPU6050帶字符驅動的i2c從設備驅動 要實現的功能就是,將MP