色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>傳感器>

HMC5883L驅(qū)動及調(diào)試的總結(jié)

2016年04月11日 15:35 快易購 作者:佚名 用戶評論(0

  關(guān)于I2C

  因為手頭有幾個傳感器,都需要用到I2C接口,所以在之前就將I2C子系統(tǒng)復習并深入研究了一番。以下我所提到的或貼出的部分代碼也許不適合真正的板級驅(qū)動,因為是以模塊化形式做測試的。

  在此模塊化驅(qū)動中,不僅要注冊驅(qū)動(i2c_driver),同時也要對設備信息進行注冊(i2c_client),我認為在這里不分前后順序(就像“先有雞還是先有蛋”的問題一樣沒有意義)。在前邊分析i2c子系統(tǒng)的時候提到過,對于在i2c適配器注冊后再添加的新的設備不能再用 i2c_register_board_info了,這會導致設備完全不能被激活,而需要用的是i2c_new_device才能將設備動態(tài)的注冊到系統(tǒng)中

  在使用i2c_new_device時候不僅需要設備的i2c_board_info結(jié)構(gòu)體,還需要其所依附的I2C適配器總線號。首先,關(guān)于總線號,可以通過i2cdetect命令進行查看:

  然后,在代碼中可以這樣使用:

  這樣就獲取了指定總線號的i2c_adapter指針,之后就可以利用這個指針給i2c_new_device用了。最后需要注意,在注冊完設備信息后,要使用i2c_put_adapter(adap)將指針釋放掉。

  用于描述硬件信息的結(jié)構(gòu)體可以做為i2c_client的私有數(shù)據(jù)保存,而這個結(jié)構(gòu)體中往往也要保存對應的client。這種互相的對應關(guān)系應該在probe接口函數(shù)中進行:

  驅(qū)動未寫,調(diào)試先行。如果在開始著手書寫驅(qū)動前就能直接的通過工具的簡單應用對器件進行調(diào)試查看的話,會對驅(qū)動的書寫有很大的幫助。所以這里要說一下關(guān)于I2C在shell中的幾個調(diào)試命令i2cdetect, i2cdump, i2cget, i2cset。首先是i2cdetect,一般用來探測和羅列總線(上邊就演示了一下),一般使用方法是:羅列總線-》探測有效設備

  查看效果如下:

  這里就可以看到,設備從地址為0x68和0x1e的設備有實際有效的硬件連接,分別是HMC5883L和AD0接地(不連)的MPU6050。0x54 55 56 57為EEPROM,設備忙。

  其次是i2cdump,用來查看器件內(nèi)部寄存器值,用法為i2cdump -y 總線號 設備地址

  然后是i2cget和i2cset,分別是對寄存器進行獲取和寫入。用法為i2cget -y 總線號 設備地址 寄存器地址 模式和i2cset -y 總線號 設備地址 寄存器地址 數(shù)值 模式。模式默認為b(byte)即讀取8bit數(shù)據(jù),i2cget可用模式有b/w/c,i2cset可用模式有b/w/c/i/s,其中w為 word(16bit),i和s分別為I2C和SMBUS的block數(shù)據(jù)。

  Mutex互斥鎖

  千萬不要忘記初始化mutex互斥鎖。靜態(tài)初始化DEFINE_MUTEX(mutex_name),動態(tài)初始化mutex_init(struct mutex *lock)。忘記初始化就使用的話是會直接造成內(nèi)核報錯的。

  在中斷上下文中不要使用mutex互斥鎖,因為如果出現(xiàn)了競態(tài),mutex有可能進入睡眠,而中斷上下文中是絕對不允許睡眠的。所以千萬不要使用,如果一定要在中斷中使用鎖機制來保護一些驅(qū)動資源,建議使用spinlock自旋鎖(semaphore信號量也不允許使用,同樣的原因)。

  關(guān)注死鎖。哪個操作需要進行鎖一定要事先自行規(guī)劃好,不要在某操作一進入的時候鎖,而進入其子步驟后又鎖,這樣就直接死鎖了,系統(tǒng)freeze掉。

  關(guān)于中斷

  中斷的使用很簡單,但是卻有很多值得注意的細節(jié)點。

  GPIO中斷。如一些開發(fā)板上,外部擴展出來很多GPIO口,但是卻找不到IRQ口,所以就需要將GPIO擴展為中斷線。在代碼中,使用gpio_to_irq(gpio_nr)函數(shù)(linux/gpio.h)就可以得到自動轉(zhuǎn)換后的中斷線號了,可以用來請求中斷。

  若在request_irq的時候最后給的參數(shù)不為NULL,那么在free_irq的時候,第二個參數(shù)也就必須與其一致,否則會使系統(tǒng)找不到要釋放哪個中斷的處理程序句柄(當然了,為NULL就都為NULL,這個沒有問題,只要一致就可以)。

  工作隊列

  工作隊列分work_struct 和delayed_work。區(qū)別就是delayed_work會在指定的延遲后開始運行,而work_struct會立即被調(diào)度運行。

  初始化。INIT_WORK(struct work_struct *work, void (*work_func)(struct work_struct *work))動態(tài)初始化work_struct。INIT_DELAYED_WORK(struct delayed_work *work, void (*work_func)(struct work_struct *work))動態(tài)初始化delayed_work,在delayed_work的work_func工作函數(shù)中,可以通過強制轉(zhuǎn)換將*work轉(zhuǎn)換為 struct delayed_work類型。

  調(diào)度。work_struct的調(diào)度為schedule_work(struct work_struct *work),而delayed_work則需要另外一個延遲參數(shù)schedule_delayed_work(struct delayed_work *work, unsigned long delay),這里的delay參數(shù)就是延遲多久后投入工作,單位是jiffies,常會用到類如msecs_to_jiffies(msecs)等轉(zhuǎn)換函數(shù)。

  如果未對工作函數(shù)指定隊列,那么其會自動進入system_wq中,在驅(qū)動中也常會用到定義自己的工作隊列,但是簡單工作往往沒有需要這樣做。

  對于頻繁上報信息的工作,最好定義自己的工作隊列,將此工作放入自己的工作隊列中運行,而不是放入系統(tǒng)默認的system_wq中,這樣會避免在系統(tǒng)忙的時候自己的工作被很快調(diào)度走,有自己的工作隊列在這方面能夠起到很大的作用。

  completion同步

  因為在調(diào)試過程中嘗試了自檢,而又涉及到中斷,所以采用了completion作為同步機制,這里提出簡單用法。

  初始化。init_completion(struct completion *wait)

  等待。wait_for_completion_timeout(struct completion *wait, unsigned long timeout),返回值為剩余時間,如果剩余時間為0,也就是說明超時了。

  喚醒。complete(struct completion *wait)

非常好我支持^.^

(5) 100%

不好我反對

(0) 0%

( 發(fā)表人:林錦翔 )

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?
      主站蜘蛛池模板: 99视频免费观看| 香蕉尹人综合精品| 日日噜噜夜夜狠狠扒开双腿| 欧式午夜理伦三级在线观看| 日本二区三区欧美亚洲国| 王小军怎么了最新消息| 亚洲黄网站wwwwww| 中文字幕无码乱人伦蜜桃| 99久久蜜臀亚洲AV无码精品| 高清一区二区亚洲欧美日韩| 国产麻豆精品久久一二三| 久久高清免费视频| 欧美精品v欧洲高清| 丝袜情趣在线资源二区| 一本道亚洲区免费观看| chinese东北老年tv视频| 国产精品成人影院在线观看| 黑人巨茎大战白人女40CMO| 免费女性裸身照无遮挡网站| 色婷婷综合激情中文在线| 亚洲视频精选| 99久久久精品免费观看国产| 国产360激情盗摄全集| 九九热在线视频精品店| 欧洲video60| 亚洲精品欧美精品中文字幕| 99国产精品成人免费视频| 国产精品久久久久久久久久久 | 中文字幕一区中文亚洲| 老师在讲桌下边h边讲课| www.青青草.com| 我在厨房摸岳的乳HD在线观看| 韩国黄色影院| 2018三级网站免费观看| 诱受H嗯啊巨肉各种play| 99久在线国内在线播放免费观看 | 99久久香蕉国产线看观看| 国产精品爽爽久久久久久蜜桃网站 | 九色PORNY真实丨首页| 人妻中文字幕无码系列| 亚洲视频在线观看免费|