Linux驱动工程师成长之路Word文件下载.docx

上传人:b****2 文档编号:1492969 上传时间:2023-04-30 格式:DOCX 页数:16 大小:30.81KB
下载 相关 举报
Linux驱动工程师成长之路Word文件下载.docx_第1页
第1页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第2页
第2页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第3页
第3页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第4页
第4页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第5页
第5页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第6页
第6页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第7页
第7页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第8页
第8页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第9页
第9页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第10页
第10页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第11页
第11页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第12页
第12页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第13页
第13页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第14页
第14页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第15页
第15页 / 共16页
Linux驱动工程师成长之路Word文件下载.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Linux驱动工程师成长之路Word文件下载.docx

《Linux驱动工程师成长之路Word文件下载.docx》由会员分享,可在线阅读,更多相关《Linux驱动工程师成长之路Word文件下载.docx(16页珍藏版)》请在冰点文库上搜索。

Linux驱动工程师成长之路Word文件下载.docx

3:

了解这个驱动的数据流。

这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。

比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。

了解这个过程我相信在调试驱动的时候是很有帮助。

分析与硬件相关通常需要我们实现的那部分源代码。

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驱动吗,他说是的就在我的部门,我是驱动经理。

我说的决定来实习。

他说那我通知人事部,人事部会再通知你。

背景:

 

阅读新闻

第一个任务-LCD(framebuffer)驱动分析

[日期:

2011-05-11]

来源:

Linux社区 

作者:

gaomaolin_88_163

[字体:

大 

中 

小]

0-前言:

以前我在学习Linux驱动的时候就特别想知道,那些正在做linux驱动工作的人到底一天都在做什么呢?

如果有谁能描述一下,那让我们这些初学者更清楚的知道工作需要些什么,那我们就更好的去学习,现在我就来记录一下,我的这个菜鸟之路。

1-实验环境:

我相信每个学习驱动的人都要做两件事:

一个是理论的学习,另一个是做实验;

理论的学习算是比较的轻松,驱动相关书籍(我用的是《LDD3》和华清的那本《Linux设备驱动开发详解》),Linux设备驱动开发详解PDF宋宝华版下载见 

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-驱动分析总结文档

第二个任务-QFIT-warnings

第一个任务是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:

UseofuninitializedvalueinsubroutineentryatAdd_Spare_Area.pmline410

UseofuninitializedvalueinpackatCalc_Spare_Area.pmline185

让我分析这个warning是如何产生的,还有就是会对我们的img产生什么样的影响。

2-我的分析:

一:

现象

(1)

(2)

上面图

(1)是在windows的dos下执行qfit.cmd后的效果,图

(2)便是与之相对应的Log文件。

从图

(1)中可以看到在操作splash.img时与boot.img,system.img不同的是在 

Converting..\..\build\ms\bin\TSNCJOLY\splash.img

toLocal/splash.ecc之后出现了下面两个warnings

UseofuninitializedvalueinsubroutineentryatAdd_Spare_Area.pmline410.

UseofuninitializedvalueinpackatCalc_Spare_Area.pmline185.

根据提示很容易找到代码所在地:

atCalc_Spare_Area.pmline185

main:

:

rs_encoder(\@buffer_temp,\@ecc,$ECC_BUFFER_BYTES_516,$ECC_10_BYTES);

从语法上来讲是传给函数rs_encoder的第二个参数\@ecc表示一个地址,用来让参数作为返回值,其具体的意义就不太清楚了。

其所在的函数为:

subadd_ctrl_7500_page_2048_width_16_main_and_spare_ecc_10。

下面就分析这个函数是怎么被调用到的。

这个可以根据Log文件来查找,因为代码所执行的所有打印信息都在log文件中会有显示出来。

将图

(1)和图

(2)结合来看提示的warning是在打印语句Converting..\..\build\ms\bin\TSNCJOLY\splash.img 

toLocal/splash.ecc和File=Local/splash.ecc之间。

所在文件 

行数:

所在函数 

Make_Factory_Image.pm:

107:

make_factory_image

——》(表示调用) 

797:

process_data_file_ecc

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()

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_Spare_Area:

calc_ecc({

array_ref 

=>

\@Buffer,

cfg_ref 

$cfg_ref,

page_layout 

$page_layout,

});

$string=pack('

C*'

@Buffer);

print{$ECCFILE}$string;

print_log(5,"

."

log中所提示的

便是add_ecc_to_file函数中的$string=pack('

这条语句。

UseofuninitializedvalueinsubroutineentryatAdd_Spare_Area.pmline410.先于

UseofuninitializedvalueinpackatCalc_Spare_Area.pmline185.所以

UseofuninitializedvalueinsubroutineentryatAdd_Spare_Area.pmline410.便是在

calc_ecc()中的,下面看Add_Spare_Area:

calc_ecc()

Add_Spare_Area.pm:

92:

subcalc_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}){

&

{$dispatch_add_spare{$page_layout}}($arg_ref);

#thisisafunctioncall

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2