下家山的嵌入式linux
直播中

h1654155781.8884

12年用户 4经验值
擅长:嵌入式技术
私信 关注

我是一个什么都不会的新手,想问一些和嵌入式相关的...

因为是学计算机的,所以尽管对嵌入式很感兴趣却止步在操作系统和硬件中间的一道坎上。我们对电子的东西一窍不通,甚至都没亲自做过一个连接串口的设备控制器的驱动。

恳请老师给做做启蒙帮忙开窍。我举个例子。假如我现在在淘宝或者电子市场买到一片线阵CMOS,我还能买到一个运行Linux的开发板比如Mini2440,然后我想做的事是自己拼一台扫描仪。那么怎么就能让这个开发板上的系统来驱动CMOS,让它运行。这中间要做什么,CMOS输出的信号是不是还要经过什么处理,最后又以什么样的形式到达串口或者并口或者其他什么接口,然后这个硬件设备又如何注册自己到Linux,Linux又如何通过驱动程序控制设备。比如我现在让它动,给它一个命令,步进电机就能按我要的速度带动这个CMOS运动。

操作系统只告诉编程人员调用系统函数,调用块设备字符设备的读取函数或者写入函数,但写了东西时候怎么进到设备里面?是不是有通用的设备控制器,针对某一种总线买来就能用,而外围设备又怎么搭配这样的设备控制器?CMOS出来的电信号又是怎么安排流入总线进入存储设备等等这些。我甚至都不知道设备控制器还要什么外围辅助的电源吗?还要什么别的控制吗?时序又是怎么确定的,频率多大是哪里决定的等等等等。


所以希望在这里能一步一步学。恳请各位给予指导、启蒙。我想除了这个CMOS扫描仪的例子我也举不出来更好的例子了,希望能有人解答问题。
谢谢!!!

回帖(3)

下家山

2012-9-12 11:54:06
  我也是计算机专业毕业的,在嵌入式这个领域,学计算机的其实占有很大的优势,因为他们对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,裸奔时代其实就是一种驱动,只是大家不那么叫而已,协议,就象看间谍剧里面的地下party接头暗号,简单的很简单,负责的当然很复杂)!
  那么嵌入式该如何学呢!现在的很多老师,书籍,培训机构,一谈到驱动,就是虚拟地址什么的,在我看来那是故弄玄虚。所以,在我的教学里面,我从来就不是一上手就跟学生讲什么虚拟地址,首先要让他们有个感性认识,那么什么是感性认识,举个例子!声卡驱动,先也不去讲什么驱动,先移植一个mplayer,先听听美妙的音乐是自己开发板上出来,然后有了这个兴趣,有了这个乐趣之后再去看内核代码,应用程序!而且,这里还有个误区就是,一些初学者,一上手就要自己写驱动,可以说这是不可能的事情,所以,各位如果真想学好嵌入式linux,还是先多看看里面的驱动是怎么写的,只有熟悉了现有的linux驱动架构,你才可以写出自己的驱动!而且,不要贪多,什么驱动都想学,其实先找个比较容易的切入点,把某一种驱动确实搞清楚后,再去拓展也不迟!
  裸奔也叫嵌入式哦,因为嵌入式一般都会跑OS,所以,我这里也是跟Linux一起说的!
                                                      2012-9-12 下家山 写于上海。松江
  本文是我个人意见, 有什么问题可以给我邮件ximenpiaoxue4016@sina.com或加我群198204885
举报

h1654155781.8884

2012-9-13 05:39:04
我先从datasheet开始看。但是对I2C总线的主从已经就不懂了。datasheet我也应该看不懂比如ACK是什么(肯定是Acknowledge但具体是什么呢)之前看过,试着理解,但是还是没用,没人指导也不知道在哪里找指导。
I2C是比较通用的一种设备总线吗?如果抛开Linux驱动这一端,在总线的另一端,应该怎么把引脚和总线相连?datasheet一般告诉我时序,就是几个引脚的电平,但是我也没看到有表说在这种情况下(比如当前就是读CMOS的一行数据)每个引脚的电平高还是低,就这些我最迷惑,似乎也没有一个人没有一本书说过这些。

I2C总线我已经找到部分资料开始对照琢磨。会发邮件给您,今后可能多有打扰,十分感谢!
举报

下家山

2012-9-13 10:57:14
CMOS扫描仪,我倒很感兴趣,如果你在上海就好了!
再说I2C,首先mcu这边肯定有两个IO口,可以配置成I2C功能,而且还有一个I2C控制器,这个控制器里面有很多寄存器,可以用来设置时钟,TX/RX模式,中断等!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分