




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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,还有 LI NUX 驱动方面的。完了来了一个人,拿着我做的题一道一道的看,我错的了,不会的还给 我讲。到目前为止也面了十几家了也做了不少题像他这样的我还是第一次碰到,他总体觉 得我还做得不错,然后就问我问题:问我做过什么项目吗?我说没有(单片机的都不好意 思说了)。问我 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 分钟后驱动经理又带来一个人说是他们总监,总监也不 Linux 驱动工程师成长之路 3 问技术问题就说你的这种情况可以先来我们公司实习到你毕业的时候就转正,实习工资 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 个像素就移到下一行,这 Linux 驱动工程师成长之路 5 样整个图像就错位了,这只是我的分析。为了验证我的想法,我在 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 410 Use 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.img to Local/splash.ecc 之后出现了下面两个 warnings 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. 根据提示很容易找到代码所在地:at Calc_Spare_Area.pm line 185 main: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.img to Local/splash.ecc 和 File= Local/splash.ecc 之间。 所在文件 :行数:所在函数 Make_Factory_Image.pm:107:make_factory_image (表示调用) Make_Factory_Image.pm:797:process_data_file_ecc Make_Factory_Image.pm:1164: process_data_file_ecc . . Tools:print_log(0,“ Converting $data_file_name n to $ecc_file n“); Calc_Spare_Area:add_ecc_to_file my $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_file Add_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, “.“); Linux 驱动工程师成长之路 7 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_ecc my ($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) #this is a function call return 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; 可以看到这里面调用了 #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 (015) $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_ecc my ($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) #this is a function call 这里可以看到 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_sp are$partition_file; #all other partition files $found_page_layout = $page_layout$nand_controller$device_type$page_bytes_user$flash_width$ecc_over_main_sp are; 就是通过上面这 两句话来对 page_layout 进行计算的,在这里面加上打印语句将,$found_page_layout 打印出来在 log 里面有如下信息: calc_page_layout in Make_Factory_Image 409 gaomaolin0:page_layout= 0x0017 8 0:BOOT 0x00000227 0x00000028 main_and_spare_ecc_10 1x_pages buildmsbinTSNCJOLYboot.img Linux 驱动工程师成长之路 9 calc_page_layout in Make_Factory_Image 409 gaomaolin0:page_layout= 0x0018 9 0:SYSTEM 0x0000024F 0x00000640 main_and_spare_ecc_10 1x_pages buildmsbinTSNCJOLYsystem.img calc_page_layout in Make_Factory_Image 409 gaomaolin1:page_layout= 0x001210 0:SPLASH 0x0000088F 0x00000008 main_and_spare_ecc_10 1x_pages buildmsbinTSNCJOLYsplash.img 11 0:CACHE 0x00000897 0x00000140 main_and_spare_ecc_10 1x_pages calc_page_layout in Make_Factory_Image 409 gaomaolin0:page_layout= 0x001812 0:USERDATA 0x000009D7 0x000005F5 main_and_spare_ecc_10 1x_pages buildmsbinTSNCJOLYuserdata.img calc_page_layout in Make_Factory_Image 409 gaomaolin1:page_layout= 0x001213 0:PERSIST 0x00000FCC 0x0000000C main_and_spare_ecc_10 1x_pages buildmsbinTSNCJOLYpersist.img calc_page_layout in Make_Factory_Image 409 gaomaolin1: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 410 Use 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 擦掉,再烧写一 遍。就不会有这个问题了。 分析问题: 通过打印 log,最后将出错的代码定位在了释放内存函数 free()中的 list_delete(node),当中。说明在 访问 Node 进出了问题。从程序执行的流程来看,先是从 logo 的高度,宽度和 bpp 计算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 泉州幼儿师范高等专科学校《第二外语Ⅱ(日语)》2023-2024学年第二学期期末试卷
- 长江职业学院《聚合物仪器分析》2023-2024学年第二学期期末试卷
- 重庆工商大学《庭院绿化》2023-2024学年第一学期期末试卷
- 福州工商学院《工艺与材料表现》2023-2024学年第二学期期末试卷
- 职业道德在二手车评估中的作用试题及答案
- 广州工商学院《计算机辅助设计(CAD)》2023-2024学年第二学期期末试卷
- 2025年陕西省山阳县初三阶段性调研测试英语试题不含附加题含答案
- 辽源职业技术学院《综合商务英语I》2023-2024学年第二学期期末试卷
- 整本书阅读《红楼梦》训练卷 统编版高中语文必修下册
- 2025【合同、协议签订规范】
- 2025年北京铁路局集团招聘笔试参考题库含答案解析
- 食品中蜡样芽孢杆菌的检验课件
- 食为天:2024中国食品饮料行业白皮书
- 2025南水北调东线山东干线限责任公司人才招聘30人管理单位笔试遴选500模拟题附带答案详解
- 电力行业电力调度培训
- 2024-2030年中国乳腺疾病预防与治疗行业深度调查及投资价值研究报告版
- 《加强基层工会组织建设 规范基层工会换届选举》课件
- 职工代表提案培训
- 轧钢工技能理论考试题库(含答案)
- 《回归分析》 课件 第1章 绪论
- 2024年资格考试-对外汉语教师资格证考试近5年真题集锦(频考类试题)带答案
评论
0/150
提交评论