最近收到一位初学者的问题,因为比较典型,而且我也做了比较长的回复,所以,贴在这里与大家共勉!
问题:
因为是学计算机的,所以尽管对嵌入式很感兴趣却止步在操作系统和硬件中间的一道坎上。我们对电子的东西一窍不通,甚至都没亲自做过一个连接串口的设备控制器的驱动。
恳请老师给做做启蒙帮忙开窍。我举个例子。假如我现在在淘宝或者电子市场买到一片线阵CMOS,我还能买到一个运行Linux的开发板比如Mini2440,然后我想做的事是自己拼一台扫描仪。那么怎么就能让这个开发板上的系统来驱动CMOS,让它运行。这中间要做什么,CMOS输出的信号是不是还要经过什么处理,最后又以什么样的形式到达串口或者并口或者其他什么接口,然后这个硬件设备又如何注册自己到Linux,Linux又如何通过驱动程序控制设备。比如我现在让它动,给它一个命令,步进电机就能按我要的速度带动这个CMOS运动。
操作系统只告诉编程人员调用系统函数,调用块设备字符设备的读取函数或者写入函数,但写了东西时候怎么进到设备里面?是不是有通用的设备控制器,针对某一种总线买来就能用,而外围设备又怎么搭配这样的设备控制器?CMOS出来的电信号又是怎么安排流入总线进入存储设备等等这些。我甚至都不知道设备控制器还要什么外围辅助的电源吗?还要什么别的控制吗?时序又是怎么确定的,频率多大是哪里决定的等等等等。
所以希望在这里能一步一步学。恳请各位给予指导、启蒙。我想除了这个CMOS扫描仪的例子我也举不出来更好的例子了,希望能有人解答问题。
谢谢!!!
我的回答:
我也是计算机专业毕业的,在嵌入式这个领域,学计算机的其实占有很大的优势,因为他们对OS的理解比电子信息,自动化的要好,当然在底层芯片的工作原理上,却不占优势,但,整个嵌入式领域,OS却是最深奥的!其实,你考虑的很全面和深刻了,如果还在学生阶段,若能尽快动手做些东西,那么你今后应该可以在研发这条路上走得很好!你的这些问题,我没有时间一一作答,下面我举一个简单的通过I2C总线如何读写EEPROM的,例子,希望对你有帮助!
要实现一个这样的功能,首先,你要看你这个要控制的设备的datasheet,搞清楚他的从设备地址,子设备地址,(如果从来没有接触过I2C总线,那么你要研究研究),然后就开始要写驱动了,写驱动当然要熟悉linux驱动架构,linux驱动主要分模块驱动和内核驱动,(通常大家所说的网络设备,字符设备,块设备是说的设备的分类,想必你可以理解),我们这里讲内核驱动,这种驱动在内核起来后会在文件系统dev下面生成一个设备文件,这个设备文件就是应用程序与内核(或者说驱动)沟通的一个纽带,那么怎么实现的呢!
在驱动代码里面,首先要配置I2C总线接口,然后映射虚拟地址,然后设置时钟,这个时钟是CPU这边I2C控制器(master)的时钟,不是你要驱动的那个EEPROM(slave)的时钟,然后就是注册设备文件描述符,建立设备文件了;
好,这个设备文件描述符,是个很大的结构体,其中有大家比较熟悉的函数如:open,write,read,ioctrl等函数,那么这些函数就相当于windows的那套API函数,是给应用程序调用的。这里当然要写一个open函数,一个close函数,还要写一个write,read函数,(具体怎么写,你去参考其他代码)
驱动是为应用服务的, 在应用程序这边,我们就可以调用系统函数open,write,read,close!
linux操作系统把我们要控制的设备抽象成了一类对象(文件),所以叫设备文件,既然是文件,对应用程序来说就透明了,应用程序不用去关心驱动是怎么写的,他只要知道这些接口函数该怎么调用就行了,而且象通用的open,write,read函数都是象访问一个文本文件一样,没有什么区别!!!
由这个问题想到的:
我一口气回答完了这个问题,而且写了那么多,但我总觉得还有些东西没有告诉这些初学者!现在其实已经到了中午12:21,但是,这就就像写作文,灵感来了,想一气呵成,所以继续写完吧,也了却了一桩心思!我很热爱研发工作(我曾因用arm7控制image sensor拍出天花板图片而欣喜若狂,想出去表达这种欣喜,晚上10点多,打个的士却不知去哪里玩,最后去网吧打游戏),我在研发之中找到了自信,找到了生命的意义,人一旦有了自信,工作中的,生活中的问题都会有信心去解决,(呵呵,老板听到这样的心声应该在窃喜,因为只有这样的工程师才能做出真正的产品,才会不那么跟他计较待遇,但话又说回来,这样的工程师老板会出高薪强这要)
我做嵌入式9年研发,2年教学,我也从对研发工作的热爱但又不知该如何入手走过来,嵌入式确实涉及面很广,硬件软件(当然我这里说的是底层,就是做driver或BSP,firmware这些职位的,上层应用的严格讲不叫嵌入式工程师),硬件要看懂原理图,IC datasheet,软件要熟悉相关总线协议,呵呵不要被驱动,协议这些字眼吓到。(驱动,就是让某个硬件设备动起来,就是设置里面相关register,裸奔时代其实就是一种驱动,只是大家不那么叫而已,协议,就象看间谍剧里面的地下党接头暗号,简单的很简单,负责的当然很复杂)!
那么嵌入式该如何学呢!现在的很多老师,书籍,培训机构,一谈到驱动,就是虚拟地址什么的,在我看来那是故弄玄虚。所以,在我的教学里面,我从来就不是一上手就跟学生讲什么虚拟地址,首先要让他们有个感性认识,那么什么是感性认识,举个例子!声卡驱动,先也不去讲什么驱动,先移植一个mplayer,先听听美妙的音乐是自己开发板上出来,然后有了这个兴趣,有了这个乐趣之后再去看内核代码,应用程序!而且,这里还有个误区就是,一些初学者,一上手就要自己写驱动,可以说这是不可能的事情,所以,各位如果真想学好嵌入式linux,还是先多看看里面的驱动是怎么写的,只有熟悉了现有的linux驱动架构,你才可以写出自己的驱动!而且,不要贪多,什么驱动都想学,其实先找个比较容易的切入点,把某一种驱动确实搞清楚后,再去拓展也不迟!
裸奔也叫嵌入式哦,因为嵌入式一般都会跑OS,所以,我这里也是跟Linux一起说的!
2012-9-12 下家山 写于上海。松江
本文是我个人意见, 有什么问题可以给我邮件ximenpiaoxue4016@sina.com或加我群198204885
用户1454308 2016-3-25 11:53
用户1678053 2016-3-25 09:00
用户1406868 2012-9-22 23:03
whxmyh_221898651 2012-9-22 17:08
用户1406868 2012-9-22 09:39
用户1615995 2012-9-15 10:31
用户1602177 2012-9-13 13:29
用户1580664 2011-2-27 09:30
用户1487776 2011-2-26 12:31
用户1171055 2011-2-25 13:00