注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

deisp的博客

 
 
 

日志

 
 

驱动详解  

2008-05-29 20:07:50|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 



]]> 会飞的风 技术学习 http://blog.sina.com.cn/s/blog_4aee4327010008ta.html#comment Sun, 29 Apr 2007 06:45:50 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008ta.html http://blog.sina.com.cn/s/blog_4aee4327010008t2.html    以下为Ubuntu目录的主要目录结构,您稍微了解它们都包含了哪些文件就可以了,不需要记忆
    /   根目录
   
    boot/      启动文件所有与系统启动有关的文件都保存在这里
        grub/   Grub引导器相关的文件
   
    dev/       设备文件
    proc/      内核与进程镜像
   
    mnt/      临时挂载
    media/   挂载媒体设备
   
    root/      root用户的$HOME目录
    home/         
        user/   普通用户的$HOME目录
        .../
   
    bin/      系统程序
    sbin/      管理员系统程序
    lib/      系统程序库文件
    etc/      系统程序和大部分应用程序的全局配置文件
       init.d/   SystemV风格的启动脚本
       rcX.d/   启动脚本的链接,定义运行级别
       network/   网络配置文件
       X11/      图形界面配置文件
   
    usr/      
       bin/      应用程序
       sbin/   管理员应用程序
       lib/      应用程序库文件
       share/   应用程序资源文件
       src/      应用程序源代码
       local/      
            soft/      用户程序      
            .../      通常使用单独文件夹
       X11R6/   图形界面系统
   
    var/         动态数据
   
    temp/         临时文件
    lost+found/   磁盘修复文件


启动流程
========
   Linux系统主要通过以下步骤启动:
   1读取MBR的信息,启动Boot Manager
       Windows使用NTLDR作为Boot Manager,如果您的系统中安装多个版本的Windows,您就需要在NTLDR中选择您要进入的系统
       Linux通常使用功能强大,配置灵活的GRUB作为Boot Manager,我们将在启动管理章节中向您介绍它的使用方式
   2加载系统内核,启动init进程
       init进程是Linux的根进程,所有的系统进程都是它的子进程
   3init进程读取/etc/inittab文件中的信息,并进入预设的运行级别,按顺序运行该运行级别对应文件夹下的脚本脚本通常以start参数启动,并指向一个系统中的程序
       通常情况下,/etc/rcS.d/目录下的启动脚本首先被执行,然后是/etc/rcN.d/目录例如您设定的运行级别为3,那么它对应的启动目录为/etc/rc3.d/
   4根据/etc/rcS.d/文件夹中对应的脚本启动Xwindow服务器xorg
       Xwindow为Linux下的图形用户界面系统
   5启动登录管理器,等待用户登录
       Ubuntu系统默认使用GDM作为登录管理器,您在登录管理器界面中输入用户名和密码后,便可以登录系统(您可以在/etc/rc3.d/文件夹中找到一个名为S13gdm的链接)
   
更改运行级别
------------
   在/etc/inittab文件中找到如下内容:   
       # The default runlevel.
       id:2:initdefault:
      
   这一行中的数字2,为系统的运行级别,默认的运行级别涵义如下:
       0   关机
       1   单用户维护模式
       2~5   多用户模式
       6   重启

服务管理
========

更改启动服务
------------
   在运行级别对应的文件夹中,您可以看到许多文件名以S##和K##起始的启动脚本链接
   例如:
       /etc/rcS.d/S35mountall.sh   挂载文件系统
       /etc/rcS.d/S40networking   启用网络支持
       /etc/rc2.d/S13gdm      启动登录管理器
       /etc/rc2.d/S20makedev   创建设备文件
       /etc/rc2.d/S23xinetd   启动超级进程
   init进程将以start为参数,按文件名顺序执行所有以S##起始的脚本脚本名称中的数字越小,它将被越早执行例如在 /etc/rc2.d/文件夹中,S13gdm文件名中的数字小于S23xinetd,S13gdm将比S23xinetd先执行
   
   如果一个脚本链接,以K##起始,表示它将以stop参数被执行如果相应服务没有启动,则不执行该脚本
   例如:
       /etc/rc2.d/K20powernowd   针对某种硬件的电源管理支持

   如果您想禁止某一服务在启动时自动运行,您可以将相应运行级别中的脚本由S##xxx重命名为K##xxx


手动控制服务
------------

   您也可以手动运行带有以下参数的启动脚本,来控制系统服务
   start      启动   
   stop      停止
   restart      重启
   例如:
   /etc/rc2.d/K20powernowd start
   
   有时您并不清楚当前运行级别,该运行级别下未必有相应脚本;而且此类脚本的前三位字符并不固定,不便于记忆这时,您可以直接使用 /etc/init.d/文件夹中的启动脚本(/etc/rcX.d/中的启动脚本链接到/etc/init.d/文件夹下相应脚本),这也是我们向您推荐的方式
   例如:
   /etc/init.d/powernowd start

Tips:以上命令的位置并没有包含在环境变量的搜索路径中,所以要输入完整路径


常用系统服务
============
   acpi-support   高级电源管理支持
   acpid       acpi守护程序.这两个用于电源管理,非常重要
   alsa      声音子系统
   alsa-utils   
   anacron      cron的子系统,将系统关闭期间的计划任务,在下一次系统运行时执行
   apmd      acpi的扩展
   atd      类似于cron的任务调度系统建议关闭
   binfmt-support   核心支持其他二进制的文件格式建议开启
   bluez-utiles   蓝牙设备支持
   bootlogd   启动日志开启它
   cron      任务调度系统,建议开启
   cupsys      打印机子系统
   dbus      消息总线系统(message bus system)非常重要
   dns-clean   使用拨号连接时,清除dns信息
   evms      企业卷管理系统(Enterprise Volumn Management system)
   fetchmail   邮件用户代理,用于收取邮件
   gdm      gnome登录和桌面管理器
   gdomap      
   gpm      终端中的鼠标支持
   halt      别动它
   hdparm      调整硬盘的脚本,配置文件为/etc/hdparm.conf
   hibernate   系统休眠
   hotkey-setup   笔记本功能键支持支持类型包括: HP, Acer, ASUS, Sony, Dell, 和IBM
   hotplug and hotplug-net   即插即用支持,比较复杂,建议不要动它
   hplip          HP打印机和图形子系统
   ifrename   网络接口重命名脚本如果您有十块网卡,您应该开启它
   inetd      在文件/etc/inetd.conf中,注释掉所有你不需要的服务如果该文件不包含任何服务,那关闭它是很安全的
   klogd      重要
   linux-restricted-modules-common   受限模块支持/lib/linux-restricted-modules/文件夹中的模块为受限模块例如某些驱动程序,如果您没有使用受限模块,就不需要开启它
   lvm      逻辑卷管理系统支持
   makedev      创建设备文件,非常重要
   mdamd      磁盘阵列
   module-init-tools   从/etc/modules加载扩展模块,建议开启
   networking   网络支持按/etc/network/interfaces文件预设激活网络,非常重要
   ntpdate      时间同步服务,建议关闭
   pcmcia      pcmcia设备支持
   powernowd   移动CPU节能支持
   ppp and ppp-dns   拨号连接
   readahead   预加载库文件
   reboot      别动它
   resolvconf   自动配置DNS
   rmnologin   清除nologin
   rsync      rsync守护程序
   sendsigs   在重启和关机期间发送信号
   single      激活单用户模式
   ssh      ssh守护程序建议开启
   stop-bootlogd   在2,3,4,5运行级别中停止bootlogd服务
   sudo      检查sudo状态重要
   sysklogd   系统日志
   udev & udev-mab 用户空间dev文件系统(userspace dev filesystem)重要
   umountfs   卸载文件系统
   urandom      随机数生成器
   usplash      开机画面支持
   vbesave      显卡BIOS配置工具保存显卡的状态
   xorg-common   设置X服务ICE socket
   adjtimex   调整核心时钟的工具
   dirmngr      证书列表管理工具,和gnupg一起工作
   hwtools      irqs优化工具
   libpam-devperm   系统崩溃之后,用于修理设备文件许可的守护程序
   lm-sensors   板载传感器支持
   mdadm-raid   磁盘陈列管理器
   screen-cleanup   清除开机屏幕的脚本
   xinetd      管理其他守护进程的一个inetd超级守护程序

重要配置文件
============
   !无论任何情况下,在修改配置文件之前,请您先备份它!
   建议您使用这个命令:sudo cp xxx xxx_`date +%y%m%d_%H:%M`
   当然这很麻烦,您可以新建一个名为bak的文件,内容如下:
      #!/bin/bash
      sudo cp $1  $1_`date +%y%m%d_%H:%M`
   把它放在您能够记住的目录下,比如/home,执行命令sh /home/bak xxx,就可以将当前文件夹下的文件xxx另存为xxx_yymmdd_HH:MM的格式了


全局配置文件
------------
   系统初始化
   /etc/inittab      运行级别控制台数量
   /etc/timezone      时区
   /etc/inetd.conf      超级进程
   文件系统
   /etc/fstab      开机时挂载的文件系统
   /etc/mtab      当前挂载的文件系统
   用户系统
   /etc/passwd      用户信息
   /etc/shadow      用户密码
   /etc/group      群组信息
   /etc/gshadow      群组密码
   /etc/sudoers      Sudoer列表(请使用visudo命令修改此文件,而不要直接编辑)
   Shell
   /etc/shell      可用Shell列表
   /etc/inputrc      ReadLine控件设定
   /etc/profile      用户首选项
   /etc/bash.bashrc   bash配置文件
   系统环境
   /etc/environment   环境变量
   /etc/updatedb.conf   文件检索数据库配置信息
   /etc/issue      发行信息
   /etc/issue.net
   /etc/screenrc      屏幕设定
   网络
   /etc/iftab      网卡MAC地址绑定
   /etc/hosts      主机列表
   /etc/hostname      主机名
   /etc/resolv.conf   域名解析服务器地址
   /etc/network/interfaces   网卡配置文件
   
用户配置文件
------------
   /etc/目录下的所有文件,只有root用户才有修改权限应用软件的全局配置文件,普通用户也不能够修改,如果您想配置软件,以适应您的需求,您可以修改它的用户配置文件

   用户配置文件通常为全局配置文件的同名隐藏文件,放在您的$HOME目录下,例如:
   /etc/inputrc      /home/user/.inputrc
   /etc/vim/vimrc      /home/user/.vim/vimrc

   也有少数例外,通常是系统程序
   /etc/bash.bashrc   /home/user/.bashrc

]]> 会飞的风 技术学习 http://blog.sina.com.cn/s/blog_4aee4327010008t2.html#comment Sun, 29 Apr 2007 01:40:09 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008t2.html http://blog.sina.com.cn/s/blog_4aee4327010008sx.html  最近一直都是忙得不可开交,不知道到底为了什么,最后一样是迷茫,使该给自己定一下目标,接着是计划了,不然只会这样不停的堕落下去了

首先我想到的是我的职业的定位,这一点我一直在考虑我到底该怎么定义我的人生道路,现在做的这一方面对于我来说是挺满足的,现在做的主要是技术,嵌入式方面,由于在学校已经学过类似的知识,感觉是挺对口的,其实大学本科毕业能够找本专业的实在是很少了,我不知道这样到底对不对,其实路真正到了你回头的时候才有资格去判断它到底对不对,不过那时已经毫无用处了

当我正在是否一直做技术时,我今天突然看到一句话,作一行要先做强,这样在转业不错,毕竟每一行都是相通的是呀,现在做就要作出一点名堂

先写到此!!!!!!!!!!!!!!!!!!

]]> 会飞的风 生活百味 http://blog.sina.com.cn/s/blog_4aee4327010008sx.html#comment Sat, 28 Apr 2007 12:49:56 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008sx.html http://blog.sina.com.cn/s/blog_4aee4327010008sw.html  什么样的工作可以当自己的职业来做?  
  什么样的工作可以当事业来做?  
  什么样的职业可以当事业来做?  

没有热情和激情,自己的职业和事业不可能达到一种颠峰的状态,最多只是平庸而已    
我觉得大部分人可能不清楚自己,所以才一直平庸我觉得认识自己的优缺点,研究一下自己喜欢干什么,想干什么,能干什么(社会能提供什么样的机会),确定自己在社会中的坐标,认清自己,发现自己,然后给自己确定一个切合实际情况的目标,然后心平气和不急不躁一步一步向前冲,这可能是取得成功的正确方法   
      想靠一夜暴富,这种机会太少了,就这么等下去?或者想就这样蹉跎岁月,最后后悔的还是自己,等你30多岁找不到工作时,自己才会明白其实这是对自己的不负责任

做事业的人,要有程序员的脑筋,更要有外交家的手腕.  

 你工作的环境对你的发展重要!

]]> 会飞的风 生活百味 http://blog.sina.com.cn/s/blog_4aee4327010008sw.html#comment Sat, 28 Apr 2007 12:23:45 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008sw.html http://blog.sina.com.cn/s/blog_4aee4327010008s8.html     最近很想对自己的人生做一个长远的规划,不知道又怎么入手,只好先上网找一些类似的文章转载以下,争取到时候做一个好的规划:
1.确定志向
志向是事业成功的基本前提,没有志向,事业的成功也就无从谈起俗话说:志不立,天下无可成之事立志是人生的起跑点,反映着一个人的理想胸怀情趣和价值观,影响着一个人的奋斗目标及成就的大小所以,在制定生涯规划时,首先要确立志向,这是制定职业生涯规划的关键,也是你的职业生涯中最重要的一点
2.自我评估
自我评估的目的,是认识自己了解自己因为只有认识了自己,才能对自己的职业作出正确的选择,才能选定适合自己发展的职业生涯路线,才能对自己的职业生涯目标作出最佳抉择自我评估包括自己的兴趣特长性格学识技能智商情商思维方式思维方法道德水准以及社会中的自我等等
3.职业生涯机会的评估
职业生涯机会的评估,主要是评估各种环境因素对自己职业生涯发展的影响,每一个人都处在一定的环境之中,离开了这个环境,便无法生存与成长所以,在制定个人的职业生涯规划时,要分析环境条件的特点环境的发展变化情况自己与环境的关系自己在这个环境中的地位环境对自己提出的要求以及环境对自己有利的条件与不利的条件等等只有对这些环境因素充分了解,才能做到在复杂的环境中避害趋利,使你的职业生涯字串3
规划具有实际意义
环境因素评估主要包括:
(1)组织环境
(2)政治环境
(3)社会环境
(4)经济环境
4.职业的选择
职业选择正确与否,直接关系到人生事业的成功与失败据统计,在选错职业的人当中,有80%的人在事业上是失败者正如人们所说的女怕嫁错郎,男怕选错行由此可见,职业选择对人生事业发展是何等重要如何才能选择正确的职业呢?至少应考虑以下几点:
(1)性格与职业的匹配
(2)兴趣与职业的匹配
(3)特长与职业的匹配
(4)内外环境与职业相适应
5.职业生涯路线的选择
在职业确定后,向哪一路线发展,此时要作出选择即,是向行政管理路线发展,还是向专业技术路线发展;是先走技术路线,再转向行政管理路线由于发展路线不同,对职业发展的要求也不相同因此,在职业生涯规划中,须作出抉择,以便使自己的学习工作以及各种行动措施沿着你的职业生涯路线或预定的方向前进通常职业生涯路线的
选择须考虑以下三个问题:
(1)我想往哪一路线发展?
(2)我能往哪一路线发展?
(3)我可以往哪一路线发展? 字串9
对以上三个问题,进行综合分析,以此确定自己的最佳职业生涯路线
6.设定职业生涯目标
职业生涯目标的设定,是职业生涯规划的核心一个人事业的成败,很大程度上取决于有无正确适当的目标没有目标如同驶入大海的孤舟,四野茫茫,没有方向,不知道自己走向何方只有树立了目标,才能明确奋斗方向,犹如海洋中的灯塔,引导你避开险礁暗石,走向成功
目标的设定,是在继职业选择职业生涯路线选择后,对人生目标做出的抉择其抉择是以自己的最佳才能最优性格最大兴趣最有利的环境等信息为依据通常目标分短期目标中期目标长期目标和人生目标短期目标一般为一至二年,短期目标又分日目标周目标月目标年目标中期目标一般为三至五年长期目标一般为五至十年
7.制定行动计划与措施
在确定了职业生涯目标后,行动便成了关键的环节没有达成目标的行动,目标就难以实现,也就谈不上事业的成功这里所指的行动,是指落实目标的具体措施,主要包括工作训练教育轮岗等方面的措施例如,为达成目标,在工作方面,你计划采取什么措施,提高你的工作效率?在业务素质方面,你计划学习哪些知识,掌握哪些技能,提高你的业务能力?在潜能开发方面,采取什么措施开发你的潜能等等,都要有具体的计划与明确的措施并且这些计划特别具体,以便于定时检查
8.评估与回馈
俗话说:计划赶不上变化是的,影响职业生涯规划的因素诸多有的变化素
是可以预测的,而有的变化因素难以预测在此状况下,要使职业生涯规划行之有效,就须不断地对职业生涯规划进行评估与修订其修订的内容包括:职业的重新选择;职业生涯路线的选择;人生目标的修正;实施措施与计划的变更等等
]]> 会飞的风 http://blog.sina.com.cn/s/blog_4aee4327010008s8.html#comment Fri, 27 Apr 2007 03:54:06 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008s8.html http://blog.sina.com.cn/s/blog_4aee4327010008ce.html

实验平台:友善之臂s3c2410

编译环境:ubuntu > arm-linux-gcc3.4.5

内核版本:Linux2.6

实验目的:在Linux下完成arm板上的8*8按键驱动开发,最终实现用一个中断程序实现           64个按键的中断触发,按键由16个io口实现矩阵键盘

       初次接触linux的驱动开发,很多的知识只能边学边做,虽说上是比较慢的,可这也是一个需要经历的过程,最终不管怎样,也是实现了项目的基本要求,在此期间的也学到了一些很基础性的知识,当然,很多东西只看是不能解决问题的,只需实验一下,调试一下,结果比看要好的多了,在此也把我如何接触并如何面对一个毫无头绪的驱动问题下手总结如下

       入门:对于一个刚接触Linux的人来说只能是先了解驱动开发的原理了,动态加载驱动可以说是我了解的第一个概念了,在系统跑起来之后,把所编译的驱动用insmod再加载进去也就是所谓的动态加载了,当然也有卸载驱动的rmmod了,在这个基础上才正式的了解了一些很基础的命令知识

       理解驱动:这个过程也许是最为抽象的了,只能找了一个示例驱动来读,比较的难啃,有种只缘身陷此山中的感觉,幸亏还只是个按键驱动,短一点,这样的话最终还是了解了驱动的架构,主要还是由几个函数组成,各个函数各有用途,总体结构是不变的,

static int __init s3c2410_button_init(void)  //初始化硬件模块

static void __exit s3c2410_button_exit(void)  //卸载硬件模块

module_init(s3c2410_button_init);           //加载硬件模块

module_exit(s3c2410_button_exit);         //卸载                 

最主要的也是最基本的就是上面的几个子函数了,也可以说是格式化的东西了,一个驱动中所必须拥有的函数,初始化和卸载其实都是些相反的过程,正如初始化干了些什么,而卸载再把所做得事情按相反的顺序去掉就行了,

初始化硬件s3c2410_button_init(void)包括了:

register_chrdev(0,DEVICE_NAME,&s3c2410_button_fops);

       //注册设备的函数,各参数含义:

       0:需要动态分配一个设备号,如果注册成功的话,把设备号返回出来,当然这        个设备号以后卸载时要用到的

       DEVICE_NAME:所定义的设备名,自己定义,加载模块后就可以查到的

       &s3c2410_button_fops:一个应用文件表,其中定义了通过映射怎么操作设备等等

devfs_mk_cdev(MKDEV(s3c2410_button_major,0), S_IWUSR,DEVICE_NAME);

       加载设备到文件系统,很格式化的东西

当然卸载硬件则是一个相反的过程了, s3c2410_button_exit()包括了:

devfs_remove(DEVICE_NAME);//刚好相反的过程

unregister_chrdev(s3c2410_button_major,DEVICE_NAME);

       //卸载设备的函数,主要传递了设备号和设备名

接下来主要是&s3c2410_button_fops这个表的建立了,其实主要是一些对应的关系了

static struct file_operations s3c2410_button_fops = {

       .owner = THIS_MODULE,

       .open  = s3c2410_button_open,

       .release=s3c2410_button_close,

       .read  = s3c2410_button_read,

};

在这里主要实现打开文件,关闭文件,读文件这几个功能,在驱动所写的程序中也就是这三个函数:

s3c2410_button_close()

s3c2410_button_open()

s3c2410_button_read()

也就是通过这个结构表的建立,我们可以在应用程序中通过open,release,read来调用这几个函数,作用还是挺大的,接下来也该看看这几个函数的内部结构了

其中的open,close函数其实系统已经默认的做了很多的调用,也就是说如果只是打开文件关闭文件的话,里面置空就行了,系统会自动完成你所需要的而read函数则是自己所要编写的实现的一个基本功能就是内核到用户之间参数的传递,也就是把通过系统模式所读到的数据通过   

copy_to_user(buff,(char *)&button_ret,sizeof(unsigned char));

传递给用户使用,这样可以防止用户直接访问系统区域导致安全隐患当然在read里面还要有一些访问各种端口所得到的数据等等,这也就是所要给用户使用的数据

       如果具备了以上的几个函数也就具有了一个驱动的大致的框架结构,可以正常的加载卸载驱动,不过具体到要驱动作些事情还是需要在各个子函数里添加一些需要用到的变量及用到的参数,这样驱动才能正式的运行,才能得到想要的结果

       键盘驱动的编写:其实也就是在原有的结构上添加一些变量,初始化一些端口,并访问,最后通过传递参数得到一个键值,这样一个键盘驱动才是最完全的

       首先说一下键盘驱动的方案,在这里的64个键盘,其中都是触发同一个中断,然后再通过中断程序扫描键盘,得到键值并存在队列里面,然后由read函数调用传递给用户使用,这里存在一个建队列的过程,这个队列其实就是一个环形的链表,由一个指针指向其中的一个结构体,然后存键值,取键值,

typedef struct {          

    unsigned char buf[MAX_BUTTON_BUF]; 

    unsigned int head,tail;          

    wait_queue_head_t wq;        

} BUTTON_DEV;

这个就是链表的结构体,包含了一个数组主要用来存放键值的,还有head,tail是用来指示当前的存放键值位置和取键值的位置,最后的wq也就是一个等待队列,这样才能在阻塞模式下工作当然在这里有个宏定义的很好,

#define    INCBUF(x,mod)    ((++(x)) & ((mod)-1)) 

这个令我费了好长时间去理解,也就是组成环形链表的一个构成,mod的值为链表长度,当x在链表的范围时是不影响的,大于时则与后自动把X置为初始值重新开始这样在设备初始化时也就需要初始化一下队列,把队列置为等待队列,

    init_waitqueue_head(&(buttondev.wq));

这样才能在阻塞模式下更好的使用这个队列作为等待队列,另外初始化还应包括对中断的初始化,

 set_irq_type(IRQ_EINT5,IRQT_FALLING);

这里把对应的IRQ_EINT5中断置为上升沿触发模式,当然模式也是可以变换的,这是根据自己的情况而定的这样除了一些所必须的架构初始化,键盘初始化已经足够了卸载当然是一样的原理,同样的架构是不变的

       打开文件open()时所需做的也是一些对各种参数的初始化,主要是对中断的申请:

request_irq(IRQ_EINT5, (void *)&matrix_button_Isr, SA_INTERRUPT, DEVICE_NAME, NULL);

当然在关闭文件时也就调用了释放中断函数,把对应的中断函数关了:

free_irq(IRQ_EINT5,NULL);

其实这一切都是对应的过程这样所对应的打开关闭文件已经做得差不多了,接下来主要就是对read()还有中断处理的操作了

       中断操作函数如下:

static void matrix_button_Isr(int irq, void *dev_id, struct pt_regs *reg)

{

              int r;

              disable_irq(IRQ_EINT5);

       if(testkey()==1)

       {

              r=get_row();

              get_row();

              key=buttonstatus[row][col];

              if(key!=0)storekey();

              while(r==get_row())mdelay(1);

       }            enable_irq(IRQ_EINT5);

}

这里主要就是关中断,中断来后禁止其它中断函数,其实这里也是一个算法的问题,

其中的取键值的过程主要是,get_row()通过判断那个为低先得到键盘按下所在的行,然后get_col()再得到键盘所在的列,主要是各个列位依次置0,判断行是否变化,如果变化则是所要找的列,这样键值就可以通过列表查到了,最后还有一个开中断的设置,不过当时一直出现一个问题,在开中断后如果按住键不松的话将会一直有中断产生,最后只好用了一条while语句,一直等到键释放后才开中断

       接下来就只剩读函数了read(),在这里主要是取冲区的键值,这样在这种情况下如果有键值的话则直接取出,然后通过

copy_to_user(buff,(char *)&button_ret,sizeof(unsigned char));

把值传递给用户区,如果没值的话则判断是否为阻塞模式,如果为非阻塞则直接返回,如果为阻塞则设置等待队列,一直等待直到唤醒后继续读值

static ssize_t matrix_button_read(struct file *filp, char *buff, size_t count,loff_t *offset)

{    

    static unsigned char button_ret;

 retry:

       if(buttondev.head!=buttondev.tail)

       {

    button_ret=buttonRead();

    copy_to_user(buff,(char *)&button_ret,sizeof(unsigned char));

    return sizeof(unsigned char);

        }

    else

        {

    if(filp->f_flags & O_NONBLOCK)

        return -EAGAIN;

       wait_event_interruptible(buttondev.wq,flag);

       flag=0;

       if(signal_pending(current))

                     {

             printk("rturn -ERESTARTSYS\n");

             return -ERESTARTSYS;

            }

    goto retry;

       }

    return sizeof(unsigned char);

}

]]> 会飞的风 技术学习 http://blog.sina.com.cn/s/blog_4aee4327010008ce.html#comment Thu, 05 Apr 2007 07:12:38 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008ce.html http://blog.sina.com.cn/s/blog_4aee4327010008an.html

一个最为简单的文件系统,其实就是配置一下busybox,建几个文件架,然后把初始化些一下就可以搭建了,基本没什么的功能

[*] Support for devfs

[*] Build BusyBox as a static binary (no shared libs)

/* 将 busybox 编译为静态连接,少了启动时找动态库的麻烦 */

[*] Do you want to build BusyBox with a Cross Compiler?

(/usr/local/arm/3.3.2/bin/arm璴inux) Cross Compiler prefix

[*] Support reading an inittab file

/* 支持 init 读取/etc/inittab 配置文件,一定要选上 */

Choose your default shell (ash) >

/* (X) ash

* #!/bin/sh */

[*] ash

[*] cp

[*] cat

[*] ls

[*] echo (basic SuSv3 version taking no options)

[*] env

[*] mv

[*] pwd

[*] rm

[*] touch

[*] mount

[*] umount

[*] Support loopback mounts

[*] Support for the old /etc/mtab file

另外,按照他的这种方法做出来的文件系统,运行的时候 shell 并不好有,没有历史记录自动补全删除字符的功能,下面介绍如何为它添加这些功能:

[*] vi-style line editing commands

二再来说一下配置文件的问题

在文件系统中,配置文件主要存放在 /etc 目录里面使用 /linuxrc 脚本

至于 rcS 这个目录的编写主要是安排哪些目录挂载哪些次级文件系统

现在已经可以跑什么也没有的系统了

声明:

由于这次作Linux确实是第一次接触,大量查找了网上的资源,目的也就是编一个最为简单的操作系统,于是乎所作步骤所写总结可能会很多copy自其他地方,敬请作者谅解

备注:

参考文档:基于 S3c2410 的 Linux 全线移植文档

参考网址:应该是luofuchong写的,非常有用,对busybox理解非常有帮助

http://www.cnitblog.com/luofuchong/archive/2007/01/10/21711.aspx

]]> 会飞的风 技术学习 http://blog.sina.com.cn/s/blog_4aee4327010008an.html#comment Tue, 03 Apr 2007 06:09:55 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008an.html http://blog.sina.com.cn/s/blog_4aee4327010008a9.html 1,内核支持

YAFFS2是YAFFS的升级版,能更好的支持NAND FLASH,我们采用最新的YAFFS2文件系统我们首先下载YAFFS文件系统

http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar

下载完成以后解压着文件包,在文件包的根目录下面有个文件patch-ker.sh,我们执行这个文件,就可以很轻松的把yaffs2加入到内核中具体命令是:

[root@localhost yaffs2]# sh patch-ker.sh /linux2.6_2410/linux-2.6.14

这里我们假设我们的linux2.6.14的内核在/linux2.6_2410/linux-2.6.14目录下执行完成以后,我们的yaffs2已经加入到了内核,在内核的fs目录下你会发现多了一个yaffs2目录,在这个目录下是yaffs2的相关内容,在内核的配置菜单[File systems]à[miscellaneous filesystems]中增加了[Yaffs2 file systems support]选项这个选项就是yaffs2的配置内容我们可以选择这个选项的全部内容,保存配置,然后退到终端,输入make,重新编译内核,内核中就增加了对yaffs2文件系统的支持

主要是把yaffs2文件系统的文件拷贝到fs目录,并修改Makefile 和 Kconfig文件

在配置方面有些地方要注意一下,以下是我的配置信息:


1,首先make menuconfig,进入配置窗口,然后选择load an Alternate Configuration File

把arch/arm/configs/smdk2410_defconfig配置文件load进来


2,进入Device Drivers->Memory Technology Devices(MTD)目录,配置界面如下:

Memory Technology Device (MTD) support

[ ] Debugging

[ ] MTD concatenating support

[*] MTD partitioning support

[ ] RedBoot partition table parsing

[ ] Command line partition table parsing

[ ] ARM Firmware Suite partition parsing

--- User Modules And Translation Layers

[*] Direct char device access to MTD devices

[*] Caching block device access to MTD devices

[ ] FTL (Flash Translation Layer) support

[ ] NFTL (NAND Flash Translation Layer) support

[ ] INFTL (Inverse NAND Flash Translation Layer) support

RAM/ROM/Flash chip drivers --->

Mapping drivers for chip access --->

Self-contained MTD device drivers --->

NAND Flash Device Drivers --->


3,进入NAND Flash Device Drivers目录,配置界面如下:

[*] NAND Device Support

[ ] Verify NAND page writes

[*] NAND Flash support for S3C2410/S3C2440 SoC

[*] S3C2410 NAND driver debug

[ ] S3C2410 NAND Hardware ECC

[ ] DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplement

[ ] Support for NAND Flash Simulator


回到File systems->Miscellaneous filesystems目录,配置信息如下:

[*] YAFFS2 file system support

--- 512 byte / page devices

[*] Lets Yaffs do its own ECC

[*] Use the same ecc byte order as Steven Hill's nand_ecc.c

--- 2048 byte (or larger) / page devices

[*] Autoselect yaffs2 format

[*] Disable lazy loading

[*] Turn off wide tnodes

[*] Turn off debug chunk erase check

[*] Cache short names in RAM



从2.6.12的fs/Kconfig中拷贝下面几项到2.6.14的fs/Kconfig中去:


config DEVFS_FS

bool "/dev file system support (OBSOLETE)"

depends on EXPERIMENTAL

help

This is support for devfs, a virtual file system (like /proc) which

If unsure, say N.


config DEVFS_MOUNT

bool "Automatically mount at boot"

depends on DEVFS_FS

help

This option appears if you have CONFIG_DEVFS_FS enabled. Setting

this to 'Y' will make the kernel automatically mount devfs onto /dev

when the system is booted, before the init thread is started.

You can override this with the "devfs=nomount" boot option.

If unsure, say N.


config DEVFS_DEBUG

bool "Debug devfs"

depends on DEVFS_FS

help

If you say Y here, then the /dev file system code will generate

debugging messages. See the file

<file:Documentation/filesystems/devfs/boot-options> for more

details.

If unsure, say N.

重新make menuconfig在File systems->Pseudo filesystems目录里面可以后到devfs的配置选项如下:

[*] /proc file system support

[*] /dev file system support (OBSOLETE)

[*] Automatically mount at boot

[*] Debug devfs

[*] Virtual memory file system support (former shm fs)

[ ] Relayfs file system support

改变启动参数

noinitrd root=/dev/mtdblock/3 init=linuxrc console=ttySAC0,115200

好了,应该完成了,保存配置后,make 生成的zImage下载到flash中就可以成功挂载yaffs2文件系统了(我现在用的是原来2.4内核用的yaffs2文件系统,所以,我现在只是帮我的板换了个2.6的内核而已,下一步打算搞一个属于自己的文件系统,呵呵)

/****************************

声明:

确实是第一次接触,大量查找了网上的资源,目的也就是编一个最为简单的操作系统,于是乎所作步骤所写总结可能会很多copy自其他地方,敬请作者谅解

备注:


]]> 会飞的风 技术学习 http://blog.sina.com.cn/s/blog_4aee4327010008a9.html#comment Tue, 03 Apr 2007 03:50:04 GMT+8 http://blog.sina.com.cn/s/blog_4aee4327010008a9.html


引文来源  听风--思考

----------------------------
一键转贴,快速捕捉生活精彩,赢每周好礼!查看活动首页>>

  评论这张
 
阅读(183)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017