博文

Linux USB gadget设备驱动解析---驱动调试(2009-12-29 16:37:00)

摘要:这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析。 一、背景知识
    1、USB Mass Storage类规范概述
       USB 组织在universal Serial Bus Mass Storage Class Spaceification 1.1版本中定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个
        独立的子类规范,即:
       1. USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport
       2.USB Mass Storage Class Bulk-Only Transport
       3.USB Mass Storage Class ATA Command Block
       4.USB Mass Storage Class UFI Command Specification
       前两个子规范定义了数据/命令/状态在USB 上的传输方法。Bulk- Only 传输规范仅仅使用Bulk 端点传送数据/命令/状态,CBI 传输规范则使用Control/Bulk/Interrupt 三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA 命令规范用于硬盘,UFI 命令规范是针对USB 移动存储。
       Microsoft Windows 中提供对Mass Storage 协议的支持,因此USB 移动设备只需要遵循 Mass Storag......

阅读全文(2765) | 评论:0 | 复制链接

【热点推荐】立宇泰ARMSYS6410开发板推出Linux2.6.28、andr(2009-11-06 14:10:00)

摘要:ARMSYS6410开发板采用了Linux-2.6.28作为标准版的linux内核,其中集成了丰富的驱动资源,充分展现S3C6410的各项特性,包括硬件编解码、2D/3D加速、显示协处理、TVOUT输出、视频采集和编码、4路串口、2路SD/MMC接口、1路10/100M以太网接口、1路USB host接口等等,使立宇泰6410开发板成为目前linux配置最为强劲和最完整的开发板之一。ARMSYS6410开发板支持Yaffs2文件系统,根文件系统提供了完整的常用命令和多种网络服务,结构清晰简明,使用灵活方便。图形界面采用Qtpia2.2.0版本,集成丰富的应用程序,可以支持触摸屏输入和鼠标输入。同时提供丰富的测试程序,可以对ARMSYS6410的各项特色功能进行充分测试和展现。更提供了android和ubuntu版本,共 3个版本的linux系统,连同WindowsCE6.0共四大主流操作系统,供客户感受最丰富的应用体验! 系统特色: 提供linux2.6.28.6版本内核,是目前国内6410开发板最高、配置最完整的linux版本; 提供丰富测试程序,全面展现S3C6410特色功能,包括H.264/263,MPEG4,VC-1视频文件解码,摄像头视频采集和编码,JPEG编解码,TVOUT输出等等; 完备的驱动资源,除视频图像处理外,还包括2D/3D,看门狗,4路串口,2路SD/MMC,1路10/100M网口,AC97音频,多种分辨率液晶屏的驱动等等; 采用NFS网络文件系统和YAFFS2格式文件系统; 提供nfs,ftp,telnet等网络服务,使linux下的应用程序开发更快捷; 提供tslib触摸屏校准,Qtopia2.2.0图形界面,系统使用方便,更接近产品化。  Linux2.6.28标准版:









详细配置,参考下表:   ARMSYS6410_Linux2.6.28相关资源 类别 功能特性 描述 引导装载 (u-boot1.1.6) Bootloader 初始化并装载启动linux内核 Download Binary by DNW 支持与......

阅读全文(2429) | 评论:0 | 复制链接

Linux操作系统环境变量的定制(2009-07-02 15:59:00)

摘要:Linux是一个多用户操作系统。每个用户登录到系统后,都会有一个专用的运行环境。一般每个用户默认的环境都是一样的,这个默认环境其实就是一组环境变量的定义。用户可以对自己的运行环境进行定制,方法就是修改相应的系统环境变量。 常见的环境变量 : 对于PATH和HOME等环境变量大家都很熟悉了。除此之外,还有下面一些常见环境变量:
  ◆ LOGNAME是指当前用户的登录名。 ◆ HISTSIZE是指保存历史命令记录的条数。 ◆ HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。 ◆ LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。 ◆ MAIL是指当前用户的邮件存放目录。 ◆ SHELL是指当前用户用的是哪种Shell。 ◆ PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt :) ”。 # PS1=" Hello,My NewPrompt :) " Hello,My NewPrompt :) 除了这些常见的环境变量,许多应用程序在安装时也会增加一些环境变量,比如使用Java就要设置JAVA_HOME和CLASSPATH等,而安装五笔输入法会增加环境变量"XMODIFIERS=@im=fcitx"等。 定制环境变量: 环境变量是和Shell密切相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。下面通过几个实例来说明。 1.设置一个新的环境变量WELCOME $ export WELCOME="Hello!" $ echo $WELCOME Hello! 2.显示环境变量HOME $ echo $HOME /home/terry 3. 使用env命令显示所有的环境......

阅读全文(1797) | 评论:0 | 复制链接

Linux启动过程中硬件模块的加载(2009-03-26 16:19:00)

摘要:  前言:我觉得我的文章相对来说都是比较浅显的。一些初学者可以看看,对于高手来说,如果你们不吝啬时间的话,希望也能帮我看看,指点一下其中的错误。这也是我到这里来和大家交流的目的。
  阅读Linux内核启动代码的直接动力是我想编写RTL8019AS的网卡驱动程序(2.4.18内核只支持了CS8900A)。既然要写驱动,我就想知道它是怎么样被加载的,好奇心驱使我先去搞定这个问题。
  拿到2.4.18的软件包,一万多个文件,我不知怎么下手。所幸手头有这么三件工具助我入门:
  1,一块移植好linux的开发板,通过它可以看到linux启动过程打印的消息。
  2, google,网上关于linux的资料真是太多了!!!
  3, Windows文件搜索引擎,通过它可以知道在那些文件中打印出那些消息。
  很快,我就找到了linux启动的总的入口,/arch/arm/boot/compressed/head.s。
  head.s完成的工作主要是底层寄存器、MMU的一些设定以及kernel的解压缩。汇编文件中调用的C代码大多位于该目录下misc.c文件,比如decompress_kernel。
  当然,这部分不是重点,head执行完毕以后就跳到start_kernel(),这才是我们的重点所在,这个函数位于文件/init/main.c中。这个文件是启动的主线!!!
  在start_kernel中,依次执行各个初始话函数,这里具体我没有看,一直到最后rest_init(),在这个函数里启动了一个init线程,而主线程自己则进入了IDLE状态。所以我们关心一下init线程做了什么事情,看文件最后init函数。
  在这个函数里面,先lock_kernel,然后调用do_basic_setup,在这个函数里面又是一堆的初始化,有一个函数要引起我们的注意:do_initcalls。看看它干了什么:(这之后的东西在下文文件系统中讲解)static void __init do_initcalls(void){initcall_t *call;call = &__initcall_start;do {(*call)( );call ;} while (call < &__initcall_end)......

阅读全文(2139) | 评论:0 | 复制链接

Linux启动过程中文件系统的加载(2009-03-26 16:14:00)

摘要:  前言:我觉得我的文章相对来说都是比较浅显的。一些初学者可以看看,这也是我不在嵌入式那个版上发文的原因。对于高手来说,如果你们不吝啬时间的话,希望也能帮我看看,指点一下其中的错误。这也是我到这里来和大家交流的目的。
  在完成了模块驱动后,就要挂载文件系统了。我一直以为:
  我编译的内核是采用了initrd的模式,设备是在RAM DISK文件系统下的/linuxrc脚本程序加载的,因此在这上面浪费了很多时间。不过对initrd算是有了比较深的理解,这个等一下再说。
  其实,内核挂载的第一个文件系统就是nand flash中的root.cramfs,关于挂载相关的代码mount_root()在文件/fs/super.c里面。随后将devcie文件系统挂载到/dev目录下面,代码为mount_devfs_fs()。因为采用了noninitrd的模式,因此文件系统的挂载就完毕了,init进程继续往下走到一直到运行:

  if (execute_command)execve(execute_command,argv_init,envp_init);这里init切换成另外一个线程,运行程序在execute_command中定义。execute_command是vivi传进来的命令行,启动过程中可以看到:
  Kernel command line: noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0因此execute_command对应/linuxrc,因此程序运行根目录下的脚本linuxrc,在我的系统中他对应:
  #!/bin/shecho "mount /etc as ramfs"/bin/mount -n -t ramfs ramfs /etc/bin/cp -a /mnt/etc/* /etcecho "re-create the /etc/mtab entries"/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 //bin/mount -f -t ramfs ramfs /etcexec /sbin/init这个就不解释了(最后是启动bash),大家可以在linux下把root.cramfs挂载到......

阅读全文(2692) | 评论:0 | 复制链接

linux 使用的一些问题杂集(2009-03-26 16:09:00)

摘要:linux的推广对于从事计算机开发,或者嵌入式设计的工程师而言是非常总要的。虽然linux看来陌生,但是也是有些问题可以简化,个人在学习的过程中感觉,体会linux对于分区的要求以及命名,是重要的,这样你就会对简单的字符界面望文生义,容易理解了。
其实系统的启动关键还是掌握linux对待设备是以文件为起点的,任何东西都是一个文件夹而已。当然理解是需要一个过程,如果安装单机的linux可能让你感觉顺手,可是不容易加深你对系统的理解,最好是安装多系统的,对比思考,事半功倍。

下面是一些问题集锦,虽然小,可是的确非常有用,虽然是入门级的,可是不积硅步,无以千里呀。
我在使用redhat 8.0 感觉不错。

NO1》
linux 下访问windows系统的命令:

mount -t vfat /dev/hda1 /mnt/c
在windows下访问linux的文件:

请大虾给我详细介绍一下rh8.0如果访问fat32分区 (2003-02-10 19:38:58)
--------------------------------------------------------------------------------
mount -t vfat /dev/hda? /mnt/*
其中的‘?’为你要挂接的分区 ‘*

No2》
不能进入图形登陆格式 (2003-02-10 18:44:22)

--------------------------------------------------------------------------------
我在linux下改变了它的启动,就是在/etc/inittab 中把它的启动程序从X11变为了Full Mutiluser Mode
,然后重启计算机,之后只能进入它的命令格式,请教各位怎样才能把它恢复到图形登陆形式。
--------------------------------
运行 startx 就可以进入图形界面
进入后再对 /etc/inittab文件修改 就可以了

No3》
我的机器装有98,2000

后来安装redha......

阅读全文(1727) | 评论:0 | 复制链接

Linux嵌入式系统开发平台选型探讨(2009-03-19 11:28:00)

摘要:1 嵌入式系统与Linux   按照电气工程师协会的一个定义:嵌入式系统是用来控制或监视机器、装置或工厂等的大规模系统的设备。具体说来,它是电脑软件和硬件的综合体;是以应用为中心,以计算机技术为基础,软硬件可裁减,从而能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。一般来说,嵌入式系统不能使用通用型计算机,而且运行的是固化的软件,终端用户很难或者不可能改变固件。而Linux也早已成为IT界家喻户晓的一个名字。概括说来,将Linux应用于嵌入式系统的开发有如下一些优点: ① Linux自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越在嵌入式系统开发中仿真工具(ICE)的障碍。 ② 内核的完全开放,使得可以自己设计和开发出真正的硬实时系统;对于软实时系统,在Linux中也容易得到实现。 ③ 强大的网络支持,使得可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。 2 嵌入式系统设计的过程   按照嵌入式系统的工程设计方法,嵌入式系统的设计可以分成三个阶段:分析、设计和实现。分析阶段是确定要解决的问题及需要完成的目标,也常常被称为“需求阶段”;设计阶段主要是解决如何在给定的约束条件下完成用户的要求;实现阶段主要是解决如何在所选择的硬件和软件的基础上进行整个软、硬件系统的协调实现。在分析阶段结束后,通常开发者面临的一个棘手的问题就是硬件平台和软件平台的选择,因为它的好坏直接影响着实现阶段的任务完成。   通常硬件和软件的选择包括:处理器、硬件部件、操作系统、编程语言、软件开发工具、硬件调试工具、软件组件等。   在上述选择中,通常,处理器是最重要的,同时操作系统和编程语言也是非常关键的。处理器的选择往往同时会限制操作系统的选择,操作系统的选择又会限制开发工具的选择。 3 硬件平台的选择 3.1 处理器的选择   嵌入式系统的核心部件是各种类型的嵌入式处理器。据不完全统计,目前全世界嵌入式处理器的品种总量已经超过1000多种,流行体系结构有30几个系列。但与全球PC市场不同的是,没有一种微处理器和微处理器公司可以主导嵌入式系统,仅以32位的CPU而言,就有100种以上嵌入式微处理器。由于嵌入式系统设计的差异性极大,因此选择是多样化的。   调查上市的CPU供应商,......

阅读全文(2172) | 评论:0 | 复制链接

gcc手册,看linux内核不可缺少的handbook(2009-03-19 11:17:00)

摘要:里面包含了gcc扩展c语言的所有用法.篇幅不是很多.我原本想找中文版的.可惜找不到.后来发觉英文版非常不错.扩展的用法其实也不是非常的多. http://www.hzlitai.com.cn/bbs/viewthread.php?tid=2005&extra=page%3D1   若不能打开请点击查看原文:http://www.hzlitai.com.cn/article/ARM9-article/system/1541.html......

阅读全文(1946) | 评论:0 | 复制链接

Linux操作系统网络驱动程序编写(2009-03-10 14:13:00)

摘要:作需要写了我们公司一块网卡的Linux驱动程序。经历一个从无到有的过程,深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把程序文档贴出来,希望和大家探讨Linux技术和应用,促进Linux在中国的普及。
  Linux操作系统网络驱动程序编写一.Linux系统设备驱动程序概述1.1 Linux设备驱动程序分类1.2 编写驱动程序的一些基本概念二.Linux系统网络设备驱动程序2.1 网络驱动程序的结构2.2 网络驱动程序的基本方法2.3 网络驱动程序中用到的数据结构2.4 常用的系统支持三.编写Linux网络驱动程序中可能遇到的问题3.1 中断共享3.2 硬件发送忙时的处理3.3 流量控制(flow control)3.4 调试四.进一步的阅读五.杂项一.Linux系统设备驱动程序概述1.1 Linux设备驱动程序分类Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。在2.0.xx到2.2.xx的变动里,驱动程序的编写做了一些改变,但是从2.0.xx的驱动到2.2.xx的移植只需做少量的工作。
  Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。字符设备是指存取时没有缓存的设备。块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access),字符设备则没有这个要求。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。一个文件系统要安装进入操作系统必须在块设备上。
  网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。
  1.2 编写驱动程序的一些基本概念无论是什么操作系统的驱动程序,都有一些通用的概念。操作系统提供给驱动程序的支持也大致相同。下面简单介绍一下网络设备驱动程序的一些基本要求。
  1.2.1 发送和接收......

阅读全文(2115) | 评论:0 | 复制链接