ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:30.81KB ,
资源ID:12706621      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12706621.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux驱动工程师成长之路.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux驱动工程师成长之路.docx

1、Linux驱动工程师成长之路Linux驱动工程师成长之路工作的选择本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。Linux驱动工程师这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那

2、个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET.,makefile);2:移植和学习linux驱动。下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识 学习Linux驱动首先得了解这个驱动对应的

3、硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议。可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。2:了解linux驱动框架 linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。3:了解这个驱动的数据

4、流。这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助。3:分析与硬件相关通常需要我们实现的那部分源代码。4:三板子上将驱动调试出来。每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。当时我学

5、习还没有到调试驱动这一步,所以那次面试也惨败收场)。好像说了这么多,还没有进入正题工作的选择。在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。一直到上周日。上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux 驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易 有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管

6、了随便投,最后又投了一下嵌入式关键字的职位。最后就瞎申请,看看职位要求差不多就申请。周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。周二上午一家也是要招linux驱动面了估计不到二分钟,他们就要招有几年工作经验马上能干活的人,不过唯一让我欣慰的是那个前台真TDM漂亮。周二下午有一家直接没去。周三有两家,上午是做专业计算机的,下午是百纳威尔(天语)linux中级驱动工程师,天语是我重点对待的对象。两家都很远去第一家要近2个小时,第二

7、家要超过2个小时,从第一家到第二家要2个小时。本来打算不去第一家,直接去天语。但想了一下去吧长一下见识也行。直接面试没有笔试问了一些大概情况,没有问太细的技术问题感觉还不错。10点到的那儿,出来才10点25,直接坐车到天语,一下车就看到两个大字“天语”,真是大,里面还有篮球场,网球场,估计有我们学校这么大,李宁 也在旁边,这个时候才12点,本来约的是下午三点前,去那边吃了个饭,又围着天语的大门转了几圈,这个时候上午那家来电话了让我下周一上班,说第一个月给我3.5k,第二个月给4k,我当时一听这么高,直接就答应了,还准备打道回府不去天语了,反正来就来了就去试一下,我从13:20进去到16:20才

8、出来,一进那个6楼我就被震到了给我一个感觉-大公司,这一层就像一个大会场一样一眼望去一片隔断式的办公桌和以前在电视里面看的很像。先让做一套题做了一个小时,都是操作系统,C语言,ARM,还有LINUX驱动方面的。完了来了一个人,拿着我做的题一道一道的看,我错的了,不会的还给我讲。到目前为止也面了十几家了也做了不少题像他这样的我还是第一次碰到,他总体觉得我还做得不错,然后就问我问题:问我做过什么项目吗?我说没有(单片机的都不好意思说了)。问我IIC,UART,LCD,SD,USB,FLASH,每个我都能答上来一些我确实也都学过,但稍微一深入点问我就不行,比如问:uboot启动时候对nandflas

9、h做哪些初始化?设置频率(瞎说的)linux启动过程?不知道(曾经准备研究)IIC有几根线?我说这个简单两根(sclk,data)。UART的速度有哪些?115200,9600.UART的流控制熟悉吗?不知道。IIC和UART有什么区别?不清楚(他说一个是同步一个是异步)。SD卡有几根线,有哪些线?9根,4根数据线,cmd线,clk线等等USB都有哪些过程?枚举,枚举就是要获取设备的信息。(这个我答得还行)愿意加班吗?不加班都不习惯。我一看这情况好像没戏,虽然东西是了解一些但是没有做过什么东西。当时我觉得已经无所谓了,反正有上午那家保底。最后他给我的评价是:没做过项目都了解这么多,已经不错了,

10、但是如果要上项目的话会比较吃力。然后他说让我等会儿,他去找他们经理再来和我谈一下。5分钟后他带来一个人说是他们驱动经理,驱动经理来了就和我聊家常,废话了半天,我只记得他说linux驱动我们很少招本科生一般都是招硕士生,即使是本科生也是工作了好几年的。这话听我感觉很爽。出去了说让我再等等,5分钟后驱动经理又带来一个人说是他们总监,总监也不问技术问题就说你的这种情况可以先来我们公司实习到你毕业的时候就转正,实习工资2k。我问他能不能提供住宿,他说实习期间可以提供住宿,我们也有班车,绕着3,4,5环转。让我呢回去考虑一下如果可以就去实习。回来之后,我当时决定就去上午那家,把最优路线都查好了。晚上把这

11、个我今天面试的情况和老孙汇报了一下,又共同探讨了一下:他说去天语,大公司,又是你梦寐以求的linux驱动,去那儿干上2-3年你不就成了高级linux驱动工程师了吗?又问了两个人都说让我去天语。最后我也决定去天语。今天上午我给那个驱动经理打电话,我再问了一下我过来是做linux驱动吗,他说是的就在我的部门,我是驱动经理。我说的决定来实习。他说那我通知人事部,人事部会再通知你。背景:阅读新闻Linux驱动工程师成长之路第一个任务-LCD(framebuffer)驱动分析日期:2011-05-11来源:Linux社区 作者:gaomaolin_88_163字体:大中小0-前言:以前我在学习Linux

12、驱动的时候就特别想知道,那些正在做linux驱动工作的人到底一天都在做什么呢?如果有谁能描述一下,那让我们这些初学者更清楚的知道工作需要些什么,那我们就更好的去学习,现在我就来记录一下,我的这个菜鸟之路。1-实验环境:我相信每个学习驱动的人都要做两件事:一个是理论的学习,另一个是做实验;理论的学习算是比较的轻松,驱动相关书籍(我用的是LDD3和华清的那本Linux设备驱动开发详解),Linux设备驱动开发详解PDF 宋宝华版下载见2-驱动调试先说一下,我感觉驱动组的人都在做什么;他们好像都是在调试bug。从我们整个公司的研发结构来讲:有做硬件的(原理图的设计,画PCB,调试硬件),我们驱动组(

13、专门负责驱动),应用程序组,测试组。测试组的人相当于用户,整天都在那儿测试,如果发现有bug他们就提交上来,这些bug很多都是我们驱动的事。比如声音有POP音,POP音什么意思呢,就是你手机开音乐时,最先出来一个特别高的音,这个bug是带我那个人在调,他已经调出来了,他说是因为codec和另外一个模块的上电顺序不对。找这种bug难吗?如果经验不多,最开始估计还得靠靠运气,有些bug真难调。以前我多少认为做驱动,就是写驱动,现在看来不是,有些驱动芯片厂家会给的,但也不是一拿来就好用。写程序,不难,难的是调试程序。带我那个人以前是做应用的,我问他是做应用难还是做驱动难,我记得他说:驱动就是会出一些

14、莫名其妙的问题,估计得做到5年以上才会轻松点(他现在做了快一年了),看来驱动还真是有点难度。以前我特别想做硬件,感觉做硬件很牛啊!我们旁边就是坐着两个做硬件的,感觉他们特别的轻松,整天笑容满面,有说有笑的,边听音乐边画PCB,而且很少加班;再看这边我们做驱动的,从最上面的驱动总监,驱动经理,再到我,每个人都愁眉苦脸,哎声叹气的,抓脑袋啊!而且每个人基本都是晚上8点后才走,我们三个实习的菜鸟都是近9点才走。测试部的美女(测试部大部分都是女的)走就走光了。看来我们以后的重点任务,就是调试驱动了。3-第一个任务:LCD驱动分析前面说了以后我们的大部分工作就是调试驱动,要调试一个驱动,如果你不懂这个硬

15、件工作原理,不熟读datasheet,不懂驱动的框架,不懂数据流的传递过程;你是基本没法去调试的。所以头儿给让我先分析LCD驱动(我的头是负责多媒体这块的驱动,包括LCD,camera,audio)最后还要自己写一个驱动分析的总结,给我了一些文档,还有指定了内核下对应的LCD驱动的源码。文档当然都是英文的所以学好英文还是很重要的。于是我就开始看datasheet和源代码,LCD驱动相对来说还比较简单,而且以前我也看过s32440上的LCD驱动,所以分析这个驱动还算顺利,大致驱动框架还是知道的。三天也就分析得差不多了,头儿的头儿见我分析得差不多了,就给来了个任务,说现在有版手机的屏,手机上的屏是

16、好的,但是通过Androidscreencast抓屏到PC机上却是花屏,usb这条通路肯定是好的,我拿过来down了内核进去发现还真是花的,好像是像素错位了。当时我是一点思路都没有。这太奇怪了,手机上的屏是好的,居然抓出来的屏是花的,这跟驱动有关系吗?头的头儿说:framebuffer里面的数据不对,好像是32字节对其的问题。行我什么都不用想看看吧。我的想法是,既然手机本身的屏没有问题,那说明LCD驱动的写的这一路没有问题,但抓屏这一路,应该是去读取framebuffer里面的数据,说明是读的这一路的问题,我把fbmem.c中的fb_fops结构体的的.read函数设为空,抓出来的屏就没有显示

17、,说明它是通过读取这个数据去显示的。但我分析了一下读的这个函数根本没有任何的问题,因为这是LCD驱动比较靠上层的函数,所有的LCD驱动,它基本都是一样的。那接着就瞎改LCD参数吧,无意之中我把屏信息的xres从原来的240改成了320就能正常显示了,最后我又改成256也能正常显示,说明这个数必须是32的整数倍就好用了。当然我不能改这个xres来解决问题,这样的话那手机上的屏肯定就不能显示正确了。得根据这个去找原理,最后在程序中某处发现像一行的像素个数必须是32的整数倍,至于为什么是32的整数倍我现在还搞懂,这得再仔细看芯片手册看能不能找到答案,如果行像素个数不是32的整数倍的话,在计算分配的缓

18、冲区长度的时候,就是会将行像素个数凑成32的整数倍,如果是240的话那就用256来算。一个像素用16bits(2bytes),那一行就多出来(256-240)*2=32个bytes.如果androidscreencast在抓屏时多抓了32个字节,而显示一行又只显240个像素,那么这剩下的32bytes=16个像素就移到下一行,这样整个图像就错位了,这只是我的分析。为了验证我的想法,我在fbmem.c的read函数中如果是读到240*2个字节的时候我就直接跳过接下的的32个字节。改了之后还是没有效果。这时我问了一个做这个驱动的同事,他说这个bug他已经解决了,给了我一个framebuffer_s

19、ervice.c说把system目录下面的././adb/framebuffer_service.c替换就好了,我实验了一下还真是好了,分析了一些他的改动和原版,大概意思和我分析的原因差不多,就是多出来的那32个字节的处理。不过这里的程序已经算是应用程序了,真是令我郁闷,我以前看的都是kernel下面的代码,而从来没有去分析过system下面的代码,因为这部分已经感觉像是应用的东西了,不过还是让我开了一下眼界。第一个任务就这样结束了。4-驱动分析总结文档背景:阅读新闻Linux驱动工程师成长之路第二个任务-QFIT-warnings日期:2011-05-11来源:Linux社区 作者:gaom

20、aolin_88_163字体:大中小0-前言: 第一个任务是Androidscreencast抓屏花屏的问题完了之后,头儿又给了一个新任务:QFIT转Img时出现了问题。1-何为QFIT: 这个我之前还从来没听过,反正就是一个工具,BP代码编出来的一个工具,它用于将多个IMG合成为一个img,然后工厂将这个img烧写到flash芯片中,再将flash芯片焊在手机上。我们编出来的Img总共有6个:boot.img,system.img,userdata.img,splash.img,persist.img,recovery.img,要将这6个转在一个名叫:factoryimage2.mbn的文件

21、。可现在只能正常转换boot.img,system.img,userdata.img,这三个,其它三个就有warning:Use of uninitialized value in subroutine entry at Add_Spare_Area.pm line 410Use of uninitialized value in pack at Calc_Spare_Area.pm line 185让我分析这个warning是如何产生的,还有就是会对我们的img产生什么样的影响。2-我的分析:一:现象(1)(2)上面图(1)是在windows的dos下执行qfit.cmd后的效果,图(2)便

22、是与之相对应的Log文件。从图(1)中可以看到在操作splash.img时与boot.img,system.img不同的是在Converting .buildmsbinTSNCJOLYsplash.imgto Local/splash.ecc之后出现了下面两个warningsUse of uninitialized value in subroutine entry at Add_Spare_Area.pm line 410.Use of uninitialized value in pack at Calc_Spare_Area.pm line 185.根据提示很容易找到代码所在地:at C

23、alc_Spare_Area.pm line 185main:rs_encoder(buffer_temp,ecc,$ECC_BUFFER_BYTES_516,$ECC_10_BYTES);从语法上来讲是传给函数rs_encoder的第二个参数ecc表示一个地址,用来让参数作为返回值,其具体的意义就不太清楚了。其所在的函数为:sub add_ctrl_7500_page_2048_width_16_main_and_spare_ecc_10。下面就分析这个函数是怎么被调用到的。这个可以根据Log文件来查找,因为代码所执行的所有打印信息都在log文件中会有显示出来。将图(1)和图(2)结合来看提

24、示的warning是在打印语句Converting .buildmsbinTSNCJOLYsplash.imgto Local/splash.ecc和File= Local/splash.ecc之间。所在文件:行数:所在函数Make_Factory_Image.pm:107:make_factory_image(表示调用)Make_Factory_Image.pm:797:process_data_file_eccMake_Factory_Image.pm:1164: process_data_file_ecc.Tools:print_log(0,Converting $data_file_n

25、ame nto $ecc_file n);Calc_Spare_Area:add_ecc_to_filemy $error = Calc_Spare_Area:add_ecc_to_file()Tools:print_log(0,File = $ecc_file);.从这个process_data_file_ecc函数里面的上面粘出来的代码可以看出来,warning就出在add_ecc_to_file这个函数中,下面看add_ecc_to_file函数Calc_Spare_Area.pm:60:add_ecc_to_fileAdd_Spare_Area:calc_ecc(array_ref=

26、Buffer,cfg_ref= $cfg_ref,page_layout= $page_layout,);$string = pack(C*,Buffer);print $ECCFILE $string;Tools:print_log(5, .);log中所提示的Use of uninitialized value in pack at Calc_Spare_Area.pm line 185.便是add_ecc_to_file函数中的$string = pack(C*,Buffer);这条语句。而Use of uninitialized value in subroutine entry at

27、 Add_Spare_Area.pm line 410.先于Use of uninitialized value in pack at Calc_Spare_Area.pm line 185.所以Use of uninitialized value in subroutine entry at Add_Spare_Area.pm line 410.便是在Add_Spare_Area:calc_ecc()中的,下面看Add_Spare_Area:calc_ecc()Add_Spare_Area.pm:92:sub calc_eccmy ($arg_ref)= _;my $page_layout = $arg_ref-page_layout;#$DB:single=1;#Tools:printf_log(10,ngaomaolin:calc_eec:page_layout= 0x%04d,$page_layout);if(defined $dispatch_add_spare$page_layout) &$dispatch_add_spare$page_layout($arg_ref);#this is a function call

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1