Linux驱动工程师成长之路.doc_第1页
Linux驱动工程师成长之路.doc_第2页
Linux驱动工程师成长之路.doc_第3页
Linux驱动工程师成长之路.doc_第4页
Linux驱动工程师成长之路.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux驱动工程师成长之路Linux驱动工程师成长之路工作的选择本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。Linux驱动工程师这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET.,makefile);2:移植和学习linux驱动。下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识 学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议。可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。2:了解linux驱动框架 linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。3:了解这个驱动的数据流。这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助。3:分析与硬件相关通常需要我们实现的那部分源代码。4:三板子上将驱动调试出来。每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。当时我学习还没有到调试驱动这一步,所以那次面试也惨败收场)。好像说了这么多,还没有进入正题工作的选择。在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。一直到上周日。上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux 驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易 有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管了随便投,最后又投了一下嵌入式关键字的职位。最后就瞎申请,看看职位要求差不多就申请。周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。周二上午一家也是要招linux驱动面了估计不到二分钟,他们就要招有几年工作经验马上能干活的人,不过唯一让我欣慰的是那个前台真TDM漂亮。周二下午有一家直接没去。周三有两家,上午是做专业计算机的,下午是百纳威尔(天语)linux中级驱动工程师,天语是我重点对待的对象。两家都很远去第一家要近2个小时,第二家要超过2个小时,从第一家到第二家要2个小时。本来打算不去第一家,直接去天语。但想了一下去吧长一下见识也行。直接面试没有笔试问了一些大概情况,没有问太细的技术问题感觉还不错。10点到的那儿,出来才10点25,直接坐车到天语,一下车就看到两个大字“天语”,真是大,里面还有篮球场,网球场,估计有我们学校这么大,李宁 也在旁边,这个时候才12点,本来约的是下午三点前,去那边吃了个饭,又围着天语的大门转了几圈,这个时候上午那家来电话了让我下周一上班,说第一个月给我3.5k,第二个月给4k,我当时一听这么高,直接就答应了,还准备打道回府不去天语了,反正来就来了就去试一下,我从13:20进去到16:20才出来,一进那个6楼我就被震到了给我一个感觉-大公司,这一层就像一个大会场一样一眼望去一片隔断式的办公桌和以前在电视里面看的很像。先让做一套题做了一个小时,都是操作系统,C语言,ARM,还有LINUX驱动方面的。完了来了一个人,拿着我做的题一道一道的看,我错的了,不会的还给我讲。到目前为止也面了十几家了也做了不少题像他这样的我还是第一次碰到,他总体觉得我还做得不错,然后就问我问题:问我做过什么项目吗?我说没有(单片机的都不好意思说了)。问我IIC,UART,LCD,SD,USB,FLASH,每个我都能答上来一些我确实也都学过,但稍微一深入点问我就不行,比如问:uboot启动时候对nandflash做哪些初始化?设置频率(瞎说的)linux启动过程?不知道(曾经准备研究)IIC有几根线?我说这个简单两根(sclk,data)。UART的速度有哪些?115200,9600.UART的流控制熟悉吗?不知道。IIC和UART有什么区别?不清楚(他说一个是同步一个是异步)。SD卡有几根线,有哪些线?9根,4根数据线,cmd线,clk线等等USB都有哪些过程?枚举,枚举就是要获取设备的信息。(这个我答得还行)愿意加班吗?不加班都不习惯。我一看这情况好像没戏,虽然东西是了解一些但是没有做过什么东西。当时我觉得已经无所谓了,反正有上午那家保底。最后他给我的评价是:没做过项目都了解这么多,已经不错了,但是如果要上项目的话会比较吃力。然后他说让我等会儿,他去找他们经理再来和我谈一下。5分钟后他带来一个人说是他们驱动经理,驱动经理来了就和我聊家常,废话了半天,我只记得他说linux驱动我们很少招本科生一般都是招硕士生,即使是本科生也是工作了好几年的。这话听我感觉很爽。出去了说让我再等等,5分钟后驱动经理又带来一个人说是他们总监,总监也不问技术问题就说你的这种情况可以先来我们公司实习到你毕业的时候就转正,实习工资2k。我问他能不能提供住宿,他说实习期间可以提供住宿,我们也有班车,绕着3,4,5环转。让我呢回去考虑一下如果可以就去实习。回来之后,我当时决定就去上午那家,把最优路线都查好了。晚上把这个我今天面试的情况和老孙汇报了一下,又共同探讨了一下:他说去天语,大公司,又是你梦寐以求的linux驱动,去那儿干上2-3年你不就成了高级linux驱动工程师了吗?又问了两个人都说让我去天语。最后我也决定去天语。今天上午我给那个驱动经理打电话,我再问了一下我过来是做linux驱动吗,他说是的就在我的部门,我是驱动经理。我说的决定来实习。他说那我通知人事部,人事部会再通知你。背景:阅读新闻Linux驱动工程师成长之路第一个任务-LCD(framebuffer)驱动分析日期:2011-05-11来源:Linux社区 作者:gaomaolin_88_163字体:大中小0-前言:以前我在学习Linux驱动的时候就特别想知道,那些正在做linux驱动工作的人到底一天都在做什么呢?如果有谁能描述一下,那让我们这些初学者更清楚的知道工作需要些什么,那我们就更好的去学习,现在我就来记录一下,我的这个菜鸟之路。1-实验环境:我相信每个学习驱动的人都要做两件事:一个是理论的学习,另一个是做实验;理论的学习算是比较的轻松,驱动相关书籍(我用的是LDD3和华清的那本Linux设备驱动开发详解),Linux设备驱动开发详解PDF 宋宝华版下载见/Linux/2011-04/35312.htm还有网上的很多资源;学习完一个驱动的理论之后,我们就要做实验,效果出来之后,我们才会感觉,真的学习了驱动。比如学习LCD驱动,先看相关理论知识,然后就得让LCD真正显示出东西来。在以前学习C语言或者应用程序的编写时,这个实验的环境很容易的搭建起来,只要一台电脑,装个开发软件就ok了,而现在这个嵌入式,是要与具体的硬件打交道,光有电脑不行,还得有板子,有了板子还得搭建这个驱动开发的环境。我的驱动学习环境是这样的:虚拟机里装RedHat5,板子里面有烧写好的bootloader,bootloader能够和PC机进行网络通信,可以通过网络下载PC机上的内核到板子上,然后让内核跑起来。内核起来之后就通过NFS挂载根文件系统,NFS根文件系统的好处就在于,我们可以在PC机上去写程序,然后在板子上挂载的NFS根文件系统的运行,效果就会在板子上显示出来(如果不了解NFS根文件系统上网查一下),不过后期我调驱动的时候都是将驱动编进内核,然后把内核下载到板子上跑。我当时为搭建这个驱动调试环境费了很大的劲,不知道搭了多少遍,主要问题出在那个bootloader不能和PC机通信,就不能用网络下载内核了,内核搞不进去就没法调了。来到公司,领到电脑后第一个任务就是搭建开发环境,公司有专门的人负责这个开发环境的搭建,装什么软件,出了什么问题都会有专门人来给你解决,我相信其它公司也一样,你去工作不会让你在搭建环境上费劲的,除非你是重头做起。所以我在这儿和初学者说一下:不要花太多的时间去搭建那个环境,工作当中公司肯定会给你做好的。拿到开发板后按照他的手册,尽快把环境搭建好进入驱动的学习。2-驱动调试先说一下,我感觉驱动组的人都在做什么;他们好像都是在调试bug。从我们整个公司的研发结构来讲:有做硬件的(原理图的设计,画PCB,调试硬件),我们驱动组(专门负责驱动),应用程序组,测试组。测试组的人相当于用户,整天都在那儿测试,如果发现有bug他们就提交上来,这些bug很多都是我们驱动的事。比如声音有POP音,POP音什么意思呢,就是你手机开音乐时,最先出来一个特别高的音,这个bug是带我那个人在调,他已经调出来了,他说是因为codec和另外一个模块的上电顺序不对。找这种bug难吗?如果经验不多,最开始估计还得靠靠运气,有些bug真难调。以前我多少认为做驱动,就是写驱动,现在看来不是,有些驱动芯片厂家会给的,但也不是一拿来就好用。写程序,不难,难的是调试程序。带我那个人以前是做应用的,我问他是做应用难还是做驱动难,我记得他说:驱动就是会出一些莫名其妙的问题,估计得做到5年以上才会轻松点(他现在做了快一年了),看来驱动还真是有点难度。以前我特别想做硬件,感觉做硬件很牛啊!我们旁边就是坐着两个做硬件的,感觉他们特别的轻松,整天笑容满面,有说有笑的,边听音乐边画PCB,而且很少加班;再看这边我们做驱动的,从最上面的驱动总监,驱动经理,再到我,每个人都愁眉苦脸,哎声叹气的,抓脑袋啊!而且每个人基本都是晚上8点后才走,我们三个实习的菜鸟都是近9点才走。测试部的美女(测试部大部分都是女的)走就走光了。看来我们以后的重点任务,就是调试驱动了。3-第一个任务:LCD驱动分析前面说了以后我们的大部分工作就是调试驱动,要调试一个驱动,如果你不懂这个硬件工作原理,不熟读datasheet,不懂驱动的框架,不懂数据流的传递过程;你是基本没法去调试的。所以头儿给让我先分析LCD驱动(我的头是负责多媒体这块的驱动,包括LCD,camera,audio)最后还要自己写一个驱动分析的总结,给我了一些文档,还有指定了内核下对应的LCD驱动的源码。文档当然都是英文的所以学好英文还是很重要的。于是我就开始看datasheet和源代码,LCD驱动相对来说还比较简单,而且以前我也看过s32440上的LCD驱动,所以分析这个驱动还算顺利,大致驱动框架还是知道的。三天也就分析得差不多了,头儿的头儿见我分析得差不多了,就给来了个任务,说现在有版手机的屏,手机上的屏是好的,但是通过Androidscreencast抓屏到PC机上却是花屏,usb这条通路肯定是好的,我拿过来down了内核进去发现还真是花的,好像是像素错位了。当时我是一点思路都没有。这太奇怪了,手机上的屏是好的,居然抓出来的屏是花的,这跟驱动有关系吗?头的头儿说:framebuffer里面的数据不对,好像是32字节对其的问题。行我什么都不用想看看吧。我的想法是,既然手机本身的屏没有问题,那说明LCD驱动的写的这一路没有问题,但抓屏这一路,应该是去读取framebuffer里面的数据,说明是读的这一路的问题,我把fbmem.c中的fb_fops结构体的的.read函数设为空,抓出来的屏就没有显示,说明它是通过读取这个数据去显示的。但我分析了一下读的这个函数根本没有任何的问题,因为这是LCD驱动比较靠上层的函数,所有的LCD驱动,它基本都是一样的。那接着就瞎改LCD参数吧,无意之中我把屏信息的xres从原来的240改成了320就能正常显示了,最后我又改成256也能正常显示,说明这个数必须是32的整数倍就好用了。当然我不能改这个xres来解决问题,这样的话那手机上的屏肯定就不能显示正确了。得根据这个去找原理,最后在程序中某处发现像一行的像素个数必须是32的整数倍,至于为什么是32的整数倍我现在还搞懂,这得再仔细看芯片手册看能不能找到答案,如果行像素个数不是32的整数倍的话,在计算分配的缓冲区长度的时候,就是会将行像素个数凑成32的整数倍,如果是240的话那就用256来算。一个像素用16bits(2bytes),那一行就多出来(256-240)*2=32个bytes.如果androidscreencast在抓屏时多抓了32个字节,而显示一行又只显240个像素,那么这剩下的32bytes=16个像素就移到下一行,这样整个图像就错位了,这只是我的分析。为了验证我的想法,我在fbmem.c的read函数中如果是读到240*2个字节的时候我就直接跳过接下的的32个字节。改了之后还是没有效果。这时我问了一个做这个驱动的同事,他说这个bug他已经解决了,给了我一个framebuffer_service.c说把system目录下面的././adb/framebuffer_service.c替换就好了,我实验了一下还真是好了,分析了一些他的改动和原版,大概意思和我分析的原因差不多,就是多出来的那32个字节的处理。不过这里的程序已经算是应用程序了,真是令我郁闷,我以前看的都是kernel下面的代码,而从来没有去分析过system下面的代码,因为这部分已经感觉像是应用的东西了,不过还是让我开了一下眼界。第一个任务就这样结束了。4-驱动分析总结文档背景:阅读新闻Linux驱动工程师成长之路第二个任务-QFIT-warnings日期:2011-05-11来源:Linux社区 作者:gaomaolin_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的文件。可现在只能正常转换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)便是与之相对应的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 Calc_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)结合来看提示的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_name 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= 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 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 callreturn 0;else main:popup_msg_ok_error(Add_Spare_Area:calc_ecc,Unsupported page_layout = $page_layout);#Tools:print_log(0, Unsupported page_layout = $page_layout n);return 1;可以看到这里面调用了&$dispatch_add_spare$page_layout($arg_ref);#this is a function call可以看到Add_Spare_Area.pm:69:sub dispatch_init%dispatch_add_spare = Calc_Spare_Area:dispatch_add_init;for my $index (0.15) $array_16_0xFF_bytes$index = 0xFF;调用Calc_Spare_Area:dispatch_add_init对dispatch_add_spare进行了初始化。仔细去看一下Calc_Spare_Area:1119:dispatch_add_init函数的实现便可以知道dispatch_add_init将总共24个计算ecc的函数装在一个数组,然后根据传进的索引值进行调用。其中第0x12个函数的调用就是导致warnings:Use of uninitialized value in subroutine entry at Add_Spare_Area.pm line 410.的函数:$CTRL_7500_PAGE_2048_WIDTH_16_MAIN_AND_SPARE_ECC_10 = add_ctrl_7500_page_2048_width_16_main_and_spare_ecc_10,再回到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这里可以看到&$dispatch_add_spare$page_layout是根据page_layout来选择不同的ecc计算函数来实现的。下面我们就追踪这个page_layout的来源。二:page_layout出于何处:QFIT.pl:3867:sub show_no_target_connectedmy $cfg_ref = Tools:get_config_data();display_configuration($cfg_ref)my $page_layout = Calc_Spare_Area:calc_page_layout仔细查看calc_page_layout这个函数的实现my $found_page_layout = $page_layout$nand_controller$device_type$page_bytes_user$flash_width$ecc_over_main_spare$partition_file;#all other partition files$found_page_layout = $page_layout$nand_controller$device_type$page_bytes_user$flash_width$ecc_over_main_spare;就是通过上面这两句话来对page_layout进行计算的,在这里面加上打印语句将,$found_page_layout打印出来在log里面有如下信息:calc_page_layout in Make_Factory_Image 409gaomaolin0:page_layout= 0x0017 8 0:BOOT 0x00000227 0x00000028 main_and_spare_ecc_10 1x_pages .buildmsbinTSNCJOLYboot.imgcalc_page_layout in Make_Factory_Image 409gaomaolin0:page_layout= 0x0018 9 0:SYSTEM 0x0000024F 0x00000640 main_and_spare_ecc_10 1x_pages .buildmsbinTSNCJOLYsystem.imgcalc_page_layout in Make_Factory_Image 409gaomaolin1:page_layout= 0x001210 0:SPLASH 0x0000088F 0x00000008 main_and_spare_ecc_10 1x_pages .buildmsbinTSNCJOLYsplash.img11 0:CACHE 0x00000897 0x00000140 main_and_spare_ecc_10 1x_pagescalc_page_layout in Make_Factory_Image 409gaomaolin0:page_layout= 0x001812 0:USERDATA 0x000009D7 0x000005F5 main_and_spare_ecc_10 1x_pages .buildmsbinTSNCJOLYuserdata.imgcalc_page_layout in Make_Factory_Image 409gaomaolin1:page_layout= 0x001213 0:PERSIST 0x00000FCC 0x0000000C main_and_spare_ecc_10 1x_pages .buildmsbinTSNCJOLYpersist.imgcalc_page_layout in Make_Factory_Image 409gaomaolin1:page_layout= 0x001214 0:RECOVERY 0x00000FD8 0x00000028 main_and_spare_ecc_10 1x_pages .buildmsbinTSNCJOLYrecovery.img从上面的打印信息可以看出出warning的三个Img(splash.img,persist.img,recovery.img)的page_layout都是0x12。下面是我们组长写的:在使用qfit生成factoryimage2.mbn时,转换splash.img persist.imgh和recovery.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经查第一条信息出现在文件Add_Spare_Area.pm中add_ctrl_7500_page_2048_width_16_main_and_spare_ecc_10中。但我们boot,system,userdata走的是add_ctrl7500_page2048_width16_main512_spare4_ecc10_G1。所以感觉这是两种不同的生成ecc的方式。但对于同一个flash来说,应该是一种。所以最终我在Calc_Spare_Area.pm中加了一下代码,使所有生成ecc的函数都走add_ctrl7500_page2048_width16_main512_spare4_ecc10_G1,不知这样是否正确?(主要是不清楚你们编译深成img中的格式)$page_layoutnand_controller_7500 SLC204816main_and_spare_ecc_10splash.img = $Ctrl7500_page2048_width16_main512_spare4_ecc10_G1;$page_layoutnand_controller_7500 SLC204816main_and_spare_ecc_10persist.img = $Ctrl7500_page2048_width16_main512_spare4_ecc10_G2;$page_layoutnand_controller_7500 SLC204816main_and_spare_ecc_10recovery.img = $Ctrl7500_page2048_width16_main512_spare4_ecc10_G2;我们nand的信息是:Page:2048,block:64page,block num:4096, bus width:16 ,block size:128K flash size:512M背景:阅读新闻Linux驱动工程师成长之路第三个任务-开机定屏日期:2011-05-11来源:Linux社区 作者:gaomaolin_88_163字体:大中小问题:将手机的boot,system,splash,userdata,recovery,全部擦掉,然后再依次烧入。再开机时手机就死在了开机logo中。从串口输出的bootloader信息来看是发生了数据异常。但是如果再将splash擦掉,再烧写一遍。就不会有这个问题了。分析问题:通过打印l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论