[136/366]2012年05月15日

2012年05月15日              周二                 多云

一、继续恬不知耻地在实验室看书……= =

二、没忍住,还是买了LAMY。一支恒星,五支墨胆,一瓶墨水。突然觉得拿这送人也挺不错的……

三、昨天发了悬赏求VIP的贴。原以为“重赏”之下必有勇夫,岂料还是石沉大海啊……太悲桑了

四、在购物车里放了很久的TCPIP原理涨了3块钱……- -一看满减的活动快结束了,赶紧下单买了。。。

五、昨天baidu电话通知了今天下午2点电话面试,结果果真2点准时(真准时,一分不差……)打过来了……听声音好像还挺年轻的。。。。好像我电话面的时候总是特别淡定。。。= =跟项目相关的东西问了好多,好像那位面试官自己之前也做了点功课……基本上是说到什么就会随口问到。后面是问C、LINUX内核的基础。感觉那个结构体sizeof的问题没答好,应该把数据对齐的情况也提一下的。。。再后来也发展成有什么问什么。。。= =TCP/IP建立连接的3次握手,想了半天没想到要怎么描述……囧,好尴尬。最后一道小算法题,不出意料地栽了……= =一通电话打了1个小时,在楼道站得快跪了。。。。完了自己也没什么感觉(好像我考试什么的都是这样……)。等看看会不会有第二面吧………虽然不抱什么希望。。。

六、晚上收到一通通知。党员/党支部评优的。一说到这个我就有怨念……虽说我一直不是什么很ambitious的人,但原本应该是我的东西被莫名其妙抢走,着实是有点不愉快……看看这次能不能拿到吧。。。明天开始准备材料

8*8 LED&键盘控制芯片CH452的Linux驱动(2.6.24)

驱动源码+测试程序源码=====> ch452

================================================================

一、总述

驱动的基本结构与MCP2510类似,可分为I2C控制器驱动与CH452芯片驱动。因为我们使用的内核中已经有很完善的S3C6410的I2C控制器驱动,因此我们要完成的只有CH452芯片驱动。

因为没有发送数据的需求(控制LED的工作由Ioctl来做),所以没有write函数。所多的无非是向内核的I2C子系统注册驱动的过程。而关于内核I2C子系统的内容,很多书上都已经介绍得很详细,不再赘述。

 

二、CH452的简单介绍

具体的内容请自行参考CH452的芯片手册。在此只说几个可能要特别注意的地方。

  • CH452接收的I2C命令都是12bit长度。这12bit中,高4bit构成了I2C的7位地址中的低4bit,低8bit则作为后续数据进行读/写(是读是写视I2C发送地址的最末一位而定。具体请参见I2C总线规范)。而7位地址的高3bit,最高两位固定是01b,第3位为芯片管脚ADDR的值(详见数据手册P9)。在我们的电路中,ADDR被接到VCC上,所以应该为1。
  • 所以, 我们在对CH452进行操作时,要用到的I2C地址不止有1个。详细对照之后可以看到7bit的I2C地址是在0×30~0x3F范围内。这在驱动程序注册i2c client时要特别注意
  • 二线制的CH452应该说只是兼容I2C的时序,但不能严格称之为I2C设备。默认情况下,它是不会向I2C主设备发送ACK信号的。这一点要特别留意。虽然芯片手册说可以用一条I2C命令开启ACK发送功能,但实际测试中发现并没有出现应有的ACK信号。
  • CH452芯片手册上称I2C数据速率可在500bps~400Kbps之间。但实际测试时,使用344kbps速率时发现I2C总线工作不稳定。因而应将I2C速率适当降低。

 

三、向I2C子系统注册驱动程序

ch452_init()中调用的i2c_add_driver()函数完成了驱动向I2C子系统注册的过程。调用顺序如下:

ch452_init()

→i2c_add_driver()

→i2c_register_driver()

 

I2C设备驱动有new style与legacy style的区别。两者似乎使用了不同的注册/操作接口,不可混用。我们这里讨论的都是legacy style。i2c_register_driver()函数中,会对每个I2C adapter调用一次driver->attach_adapter(adapter)。此函数也是由我们自己来实现的,具体到本驱动中就是ch452_attach_adapter()函数。

在ch452_attach_adapter()函数中,有对CH452芯片的初始化操作,最后调用i2c_probe()函数,将i2c client结构关联到i2c adapter上。i2c_probe()函数的第二参数为一个struct i2c_client_address_data类型的指针,该结构提供了待注册的i2c client的地址。我们要关注的只有其中的normal_i2c成员。这个指针提供的I2C地址,如果没有出现在ignore结构中,就对其调用i2c_probe_address()函数。在此函数中,确认该地址的可用性(即确认该地址没有被其它i2c cilent使用)后,调用函数第三个参数found_proc指向的函数。具体到我们的驱动程序中,就是ch452_detect()函数。在这个函数中,初始化i2c client结构、调用i2c_attach_client(),真正完成i2c client与i2c adapter的关联过程。在对normal_i2c内所有地址都完成这个调用过程后,驱动向I2C子系统的注册过程才算结束。

如上所述,CH452要用到I2C地址为0×30 ~ 0x3F,因而在驱动初始化时,向struct ch452_dev结构的client成员分配了16个struct i2c_client的空间,用于这16个地址的i2c client的注册。

 

四、I2C控制器工作过程

向CH452发送I2C命令,全部是通过i2c_transfer()函数来实现。注意所有struct i2c_msg的flags都被加上了I2C_M_IGNORE_NAK标志。这是因为目前因为未知原因没能打开CH452的ACK使能。I2C控制器驱动在没有接收到ACK的时候会认为发送失败并中止发送过程。因此,加上I2C_M_IGNORE_NAK标志,让I2C控制器忽略对ACK的处理。

i2c_transfer()函数中,通过调用i2c_adapter的algo->master_xfer(adap,msgs,num),实现真正的发送。在i2c-s3c2410.c中的第579行可看到:

static const struct i2c_algorithm s3c24xx_i2c_algorithm = {

         .master_xfer             = s3c24xx_i2c_xfer,

         .functionality            = s3c24xx_i2c_func,

};

 

s3c24xx_i2c_xfer()中有一个重发循环,通过调用s3c24xx_i2c_doxfer()进行发送,如果发送失败则等待+重发。s3c24xx_i2c_doxfer()中,先s3c24xx_i2c_set_master()将控制器配置为主设备(该驱动不支持从设备模式),s3c24xx_i2c_enable_irq()使能I2C中断,最后用s3c24xx_i2c_message_start()开启发送过程。在中断处理中,再根据s3c24xx_i2c控制器设备的state进行不同的处理。可以说整个I2C发送过程就是由中断驱动的,具体的工作过程请自己跟踪代码。很多书上也有相关的讲解。

[131/366]2012年05月10日

2012年05月10日             星期四                    晴

一、又玩游戏了

二、迷失自我实在是件太可怕的事情。也许我对游戏的痴迷也与此有关?就像戴着黄金面具混在狂欢节人群里的Ezio一样。别人看到的都是完全陌生的自己

三、最尴尬还是当时lyb形容我的那几句。话多,爱笑,能喝酒。这特么哪点能跟我扯上关系啊……可这偏偏就是别人眼中的我

四、摊手…

五、不知是从什么时候开始就一直在背负自己给自己投射的阴影。总是背对世人,背对阳光,自己能看到的永远只是阴影。温暖?温柔?!笑了…哪有的事啊

六、包括老妈说我的性格有点像我的奶奶,心肠特软的那种。当时她跟我姑妈这样讲的时候我真是尴尬死了

七、现在想来,似乎也不是完全不对。至少要完全铁石心肠还是办不到…或者说是没完没了的优柔寡断?

八、一直有种单纯的想法。自己怎样去对待别人,别人就会、或者说是就应当怎样对待我。所以才会九在餐厅跟服务生客客气气各种敬语。所以才会在当助管的时候尽力为别人的事情跑上跑下忙前忙后

九、所以啊,也许我真的有过“温暖”的时候,我也有过特真诚的时候。但当我觉得自己只是一厢情愿地表演时,觉得只是自己在一味被鞭笞一味被打脸的时候,我就会渐渐地收回那一面了

十、如果你已经认定了,就请坚定不移地走下去,并且放其他人一条生路。这句话对大家都适用

[127/366]2012年05月06日

2012年05月05日             周日                晴

一、热爆了。第一次有了夏天的感觉

二、上午霸了百度笔试。软件研发CPP。果然比腾讯难不少。没有客观题,全是简答……总之拿到卷子的时候就傻了,然后各种瞎写……唉,还是实力不济。晚上波波已经收到面试通知了。唉桑心…

三、晚上去了说了好久的光谷的四季恋。真心有种被骗的感觉。外婆红烧肉还好,就是甜得厉害,吃了两块就腻味了。红烧狮子头做得还行,尝了二饼的清蒸狮子头也不错。锅贴我感觉还行,汁挺多的,但江苏人波波表示无爱。煎包,底部还有芝麻,但感觉一般,还没喻园的好吃。菠萝油条虾,没什么特别好吃的感觉,虾仁也一般,吃的前两个愣是没尝出来虾在哪儿。黑椒牛柳也是甜口的…酱油味重,完全没有黑椒的感觉了,就是一大块肉到嘴里而已。肉质倒是比较嫩。冬瓜老鸭汤,冬瓜连皮都没削。鸭子一股禽类的骚味,下锅之前没仔细焯水吧…最失败还是那锅什么牛蛙,一端上来就是一股腥味,像没煮熟一样。可吃进嘴里的肉还发柴…尝一口就吐了。迄今为止吃的最难吃的牛蛙无疑。可能是因为之前很多人推荐吧,结果倒是期望越大失望越大了。总的来说中等偏下吧…菜份量不多倒无所谓,做得难吃真是无法原谅。最后四个人吃了392…这学期我们几个算吃了不少地方了,感觉就这次吃得最失败…兄弟们我对不起你们……

四、吃饭后顺便把头发剪了。看来拍标准照的计划要往后推推了…

五、晚上洗了今年第一个冷水澡,感觉尚佳。

六、今天又是号称多少百年不遇的大月亮么?不知又有多少人要变身啊…

七、下午干了点活。跟皓哥一起研究了下把空调开开了。决定这个月不再碰游戏了,自己警醒一下

八、Lily给的鸡蛋突然毫无征兆地破了,洒了好大一滩…CAN 小板子给报废了……………

九、看了车版发的一个视频,是一个在藏区骑行的驴友,过一段塌方路面时被落下的沙石砸下悬崖的…还是少看这种视频以后,半天心里都不舒服。

[126/366]2012年05月05日

2012年05月04日           星期六                   多云,晴

一、没药救啊,又撸了一天游戏…亏我今天那么早去了实验室。上午打了酱油,本想中午打会儿就干活的,结果一天就过去了……跪…谁来打死我吧

二、不过说起来,刺客信条2是要比1简单一些,大部分任务都能一遍完成。不像1有些任务蛋疼的,得试个七八遍才能搞定…而且任务内容丰富很多,马车追击、滑翔机任务,都是很有特点的。武器、动作模组也是多了N多,用短刀A人太犀利了…只是会被缴械有点尴尬,时常就会面对一地的武器不知道捡哪一个才对。。。噢,还有,我们的传奇刺客终于可以下水了…不然在水城威尼斯真不知道怎么办了。。

三、啧啧,高中时的日记里经常会记打游戏的情况,一写就是好几页,想想,这么久过去了难道还是没变么…

四、明天百度笔试,过去看看能霸笔不。不然心里总感觉没有底啊…