中断与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的一个项目,他们把电池搞了两个正极两个负极,搞得不能检测这个温度了,这就是一个杯具啊。。哈哈。

写个日志,感觉对得起今天。哈哈。晚上看了看内核邮件队列,太多了,也看不完,挑几个看看吧。。

posted @ 2011-03-24 22:37  冷月X  阅读(2687)  评论(0编辑  收藏  举报