中斷與I2C讀寫

要寫的內容好像有點標題黨的意思。

早上收到郵件讓我在860x_irq裏打log看是不是插下充電器時會收到中斷。結果最後還是發生了一次沒有收到中斷的情況。這個問題有點糾結啊。具體是啥也沒有必要寫了。估計應該是硬件有缺陷。

上午服務器買了三塊硬盤,做了一個raid5,我把硬盤擴展到分區上去了。三個300G的,做個raid後變600G,幸好上次修改服務器的時候把/work工作分區做成了lvm,這次擴展起來方便多了。pvcreate,vgextend,lvresize.都很順利,分區下有很多重要的數據,生怕弄壞了,幾個項目經理又要砍我了。於是我把分區給umount掉了,然後做resize2fs,不讓我resize,說是設備在忙,百思不得其解,差一點就把服務器給重啓了,後來我試着把分區掛上,用online mode擴展,發現可以。但是擴展600G確實有點慢啊,大概一分鐘10G的速度吧。不過還好,最後終於弄好了,捏了一把汗啊。

下午看了一下8607的interrupt registers的設置。用三個interrupt registers,0x[3-5],每一位用一個mask設置一箇中斷。每一個都是8位的。這樣也有24箇中斷了。這個是用I2C來讀寫的。看到寫registers的時候有點疑惑,寫I2C的時候bulk_write,一次搞了3個bytes。然後在前面加了1個byte的reg地址,組成了一個I2C的傳輸格式,然後用i2c_message_send搞出去。我當時很傻B地想,一次搞3個進去,一個8位的寄存器情何以堪啊。後來看了看spec,又問了一下同事,他說這個可以給一個地址,按地址往後面的寄存器依次寫,這個看來是比較給力啊,有些才支持,這個我不太確定。但是在這裏,用了兩個bulk_write,搞進去了6個bytes,就把0x3-0x8,6個寄存器都設好了,確實有點給力啊。

然後spec中還說了這裏I2C通信的格式,最前面有一個字節的slave,這個玩意是默認的,具體我也沒太搞清楚,明天再看看,接着一個字節的寄存器地址,按着就是數據,最後還有STOP標誌啥的。I2C這個玩意看起來還真挺不錯的。看代碼裏,弄了一個buf[bytes + 1], buf[0]=reg,把寄存器搞了進去,memcpy(&buf[1], src, bytes),把數據也搞了進去。然後用 i2c_master_send(i2c, buf, bytes + 1),用I2C搞出去了。reg_write也是這樣實現的,只不過bytes=1。嗯 ,這個還是看明白了,代碼應該是在88pm860x-i2c.c裏面吧。其實上次在書上看了看i2c通信,沒有很是理解清楚,後來又忘了,下次還是得仔細地看看i2c-core了。

下午搞電池溫度保護的時候一個TINT和TBAT把我搞得打了好久的printk.在我這裏用了一個GPADC1的管角來搞溫度,讀出來的數據跟別的寄存器一樣,用了一個公式搞成了mV的單位,然後又搞了一個數組把mV和溫度對應了起來。這個數組我覺得應該跟硬件的同事再確認一下,到底哪個溫度電阻是多少,才能確實下來電壓是多少。這個玩意整得也不錯。

今天抽菸的時候問了一下硬件同事,才明白其中的原理,一個熱敏電阻弄到電池中,溫度變化,電阻變化,再量一下電壓就知道溫度,看來搞得挺有道理的。讓我想起了前段時間yuxin的一個項目,他們把電池搞了兩個正極兩個負極,搞得不能檢測這個溫度了,這就是一個杯具啊。。哈哈。

寫個日誌,感覺對得起今天。哈哈。晚上看了看內核郵件隊列,太多了,也看不完,挑幾個看看吧。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章