![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
驱动
文章平均质量分 86
梦想与坚持
勤能补拙是良训,每个人生来都不是优秀的。
展开
-
volatile关键字
volatile关键字前半部分内容摘自百度百科:http://baike.baidu.com/view/608706.htm?fr=aladdinvolatile关键字的英文意思是易变的,不稳定的。一般用于修饰变量。volatile的使用场合:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量原创 2014-09-04 20:22:21 · 554 阅读 · 0 评论 -
基于中断的LED驱动程序
1.linux中程序切换到后台去运行,第一种办法是在输入命令的时候在末尾加上&符号:# ./test &如果测试程序已经在运行了,这个时候可以按ctrl+z将程序切换到后台去运行。将后台运行的程序切换到前台:# fg如果有多个后台程序,可以先使用jobs命令,然后使用fg+数字来指定将某个程序切换到前台。# top这个命令可以查看各个进程使用CPU的比例(类似于wind原创 2014-01-23 22:03:40 · 878 阅读 · 0 评论 -
文件系统制作&NFS
1.内核怎样启动第一个应用程序(1)打开一个设备open("/dev/console");sys_dup(0);sys_dup(0);注释:open函数打开一个文件(第一个文件标号为0),sys_dup(0)表示复制第一个文件,所以printf,scanf,err三个都指向终端/dev/console。(2)通过run_init_process来启动程序,这个函数如果传入的原创 2014-01-08 21:59:24 · 876 阅读 · 0 评论 -
s3c2440的2440init.s详解
;=========================================; NAME: 2440INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks; Initialize C-variables; HISTORY:; 2002.02.25:kwtark: ver 0原创 2014-01-08 09:36:35 · 2157 阅读 · 0 评论 -
RO、RW和ZI段详解
要了解RO,RW和ZI需要首先了解以下知识: (1) ARM程序的组成此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。一个ARM程序包含3部分:RO,RW和ZIRO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量由以上3点说明可以理解为:RO就是转载 2014-01-08 09:34:20 · 2170 阅读 · 0 评论 -
内核启动之内核启动流程
1.创建一个sourceInsight工程将Linux-2.6.22.6_jz2440中的所有代码加入,然后移除掉Arch,然后将Arch中的Boot、Common、Configs、Kernel、Lib加入,Mach-s3c2410、Mach-s3c2440加入,将Mm、Mwfpe、Oprofile、Tools、Vfp加入,将plat-24xx加入;去掉include目录,然后将include原创 2014-01-06 21:36:13 · 833 阅读 · 0 评论 -
第六章 驱动开发_JTAG接口和supervivi
1.BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。2.JTAG接口可以用来烧写程序,除此之外,JTAG接口在开发中最常见的用途是单步调试,不管是市面上常见的JLINK还是ULINK,以及其他的仿真调试器,最终都是通过JTAG接口连接的。标准的JTAG 接口是4 线:TMS、TCK、TDI、TD原创 2014-01-03 21:50:31 · 1092 阅读 · 0 评论 -
第二章 驱动开发_devfs设备文件系统详解
Devfs,也叫设备文件系统(DeviceFilesystem),设计它的唯一目的就是提供一个新的(更理性的)方式管理通常位于 /dev的所有块设备和字符设备。您也许知道,典型的 /dev树包含数百个块特殊文件和字符特殊文件,它们全都在根文件系统上。每个特殊文件都可以让用户空间进程轻松地与内核设备实现交互。举例来说,通过对这些特殊文件执行操作,您的X 服务器就能够访问视频硬件, fsck原创 2014-01-03 21:50:22 · 1039 阅读 · 0 评论 -
s3c2440的LED点灯裸机C程序
1.gcc编译的时候-g选项表示添加一些调试信息。一个程序一般会经过(针对一个linux程序)(1)预处理(2)编译:.c文件处理为.s文件(3)汇编:.s文件处理为.o文件(4)链接:把多个.o文件合并为一个可执行文件2.nor flash不能像内存一样写数据,必须先擦除再写。3.main函数被谁调用?main函数的返回值给谁了?答:普通应用程序,main函数会被原创 2013-12-09 10:37:12 · 2058 阅读 · 0 评论 -
s3c2440的2440init.s详解_补充
1.S3C2440支持两种启动方式:NAND FLASH和NOR FLASH。网上有很多文章分析TQ2440的启动文件2440init.s。介绍的很详细,我这里只是把S3C2440上电后的程序流程描述下。不管在哪种启动方式下,ARM上电启动都是从0X00000000开始运行。下面是复位程序入口。AREA Init,CODE,READONLYENTRYResetEntryb原创 2014-01-08 09:37:51 · 1365 阅读 · 0 评论 -
第四章 驱动开发_vivi、uboot、eboot的区别
简单的说它们都是bootloader,所完成的任务也大同小异。vivi是mizi开发的用于s3c241x/s3c244x 的linux bootloader, 友善之臂移植了USB下载功能后就成了现在看到的superviviu-boot是一个广泛用于ARM平台的bootloader,目前也支持s3c241x/s3c244x,可以用来启动LinuxEboot是WinCE平台下的bootlo原创 2014-01-03 21:50:27 · 1068 阅读 · 0 评论 -
第三章 裸机_第一个裸机程序(上)
第一章 裸机调试入门知识1.对于友善之臂Micro2440开发板进行裸机调试时,需要将启动FLASH选项开关拨动到NORFLASH上。这样做的原因:裸机程序里面会包含很多的初始化,这些初始化一般都是由u-boot或者vivi来完成的,而u-boot或者vivi一般都放在NORFLASH中,所以启动选项要选择到NOR FLASH上。2.H-JTAG和J-LinkH-JTAG:H-JTAG原创 2014-01-03 21:50:12 · 1405 阅读 · 0 评论 -
uboot分析之uboot启动内核分析
uboot原创 2013-12-31 16:01:17 · 998 阅读 · 0 评论 -
s3c2440的Nand flash裸机程序
1.nand flash的控制脚CLE有效表示传送的是命令,ALE有效表示传送的是地址,如果这两个都无效那么表示传送的是数据。2.nand flash的结构,开发板上使用的nand flash的页大小是2K,每一页附加了64字节的OOB;64页组成一块(一块的大小是128KB+4KB),但是每一页的64字节的OOB在大多数场合是不参与地址的编址的。如果要读取2049这个地址上的数据,那么读取的原创 2013-12-10 22:08:13 · 1220 阅读 · 0 评论 -
s3c2440的SDRAM裸机程序
1.CPU读取数据是通过存储管理器来实现的。2.对于SDRAM的操作,需要注意的是:(1)位宽(2)行/列地址(3)刷新周期(4)Bank地址3.2440对外能够接8个SDRAM类的芯片,因为内部分为8个bank,有8个片选信号线。4.SRAM和SDRAM对比SRAM:价格比较贵,访问简单,只需要发出地址信号即可。SRAM是英文Static RAM的缩写,即静态原创 2013-12-09 21:17:42 · 1318 阅读 · 0 评论 -
s3c2440的LED点灯裸机汇编程序
1.s3c2440裸机LED点灯代码(汇编代码).text.global _start_start: LDR R0,=0x56000010 @ R0设为GPBCON寄存器。此寄存器 @ 用于选择端口B各引脚的功能:原创 2013-12-08 19:56:49 · 2014 阅读 · 0 评论 -
s3c2440的MMU裸机程序
1.权限管理内核以及各个应用程序都有自己的空间,各自都只能访问属于自己的内存空间段,这样做的好处是A程序的崩溃不会导致B程序出问题,同时也可以防止恶意程序修改别的程序的空间的数据。2.在windows中打开两个C程序(都是打印A变量的地址和值),打印出来A的地址值一样,但是A的值却不一样。解释:这是因为windows的虚拟地址导致的,打印出来的A的地址是一个虚拟的地址,并不是A变量存放原创 2013-12-10 19:05:33 · 1189 阅读 · 0 评论 -
s3c2440的中断裸机程序
1.ARM的几种工作状态(1)拥有不同的寄存器有些模式拥有自己独特的寄存器,同样的一条赋值指令,可能是赋给不同的寄存器,那么模式切换的时候很多变量就不用保存,因为它们仍然存放在上一个模式的寄存器中。(2)不同的权限不同的模式可以访问的空间不同,这个是配合MMU来使用的。(3)触发条件上电后位于管理模式;发生中断时进入IRQ模式;如果读取到的指令是未定义的指令则进入未定义指令原创 2013-12-11 21:42:05 · 957 阅读 · 0 评论 -
字符设备驱动程序——异步通知
1.各种读取按键值的方式比较查询:耗CPU资源中断:在应用程序中的read函数一直会休眠,直到有中断发生。poll:在一段时间内跟中断相同,但是超时之后read函数会返回。三种共同点:应用程序主动去读取按键的状态。2.驱动程序主动去提醒应用的方式:异步通知实现方式:signal举例:# kill -9 PIDkill发送9信号到PID在ubuntu上测试的简原创 2014-03-04 20:55:53 · 1361 阅读 · 0 评论 -
字符设备驱动程序之poll机制
最近看了一下Linux Poll 机制的实现,看了韦老师的分析文档,总结如下: int poll(struct pollfd *fds,nfds_t nfds, int timeout);总的来说,Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读,如果有,返回fd转载 2014-03-02 10:41:17 · 1042 阅读 · 0 评论 -
第七章 驱动开发_第一个字符型设备(LED)驱动
1.下图是驱动的基本示意图应用程序调用open,read,write等函数,open等函数是在c库中是实现的(通过swi + value指令就会触发一个异常),这个异常进入内核空间,内核空间就会根据不同的值调用sys_open,sys_read,sys_write等函数,这些函数根据打开的不同的文件的属性找到更为底层的驱动程序。2.对于一个最为简单的字符型驱动程序,最简单的做法就是让上原创 2014-01-11 09:30:27 · 998 阅读 · 1 评论 -
第四章 裸机_裸机开发知识补充
原理图部分:1.芯片内部上拉功能的使用,在外接按键或者用作中断功能的时候可以将内部上拉功能使能,这样就避免了在外部电路需要接一个上拉电阻。2.2440的内存控制器会根据CPU发出的地址范围自动将对应芯片的片选端使能,能实现的原因是各个外设映射的地址不一样。3.协议:(1)你说的别人能听懂:双方约定信号的协议。(2)你说的语速要让别人接受:双方满足时序要求。4.UART:Un原创 2014-01-08 09:42:20 · 902 阅读 · 0 评论 -
第三章 裸机_第一个裸机程序(中)
1 使用ADS 创建LED 工程本节通过一个简单的具体实例,介绍如何使用 ADS集成开发环境。包括如何创建一个新的工程,如何配置编译选项,并编译生成可以直接烧写到Flash中的bin 格式二进制可执行文件。1.1 建立一个工程在 ADS 集成开发环境中,点File->New,打开如图所示窗口:可以看到有 7 种工程类型可以选择:ARM Excuteable Im原创 2014-01-08 09:25:29 · 822 阅读 · 0 评论 -
内核启动makefile分析
1.子目录下的makefilea.c和b.c要编译进内核:obj-y+=a.o b.oa.c和b.c要联合组成一个模块:obj-m+=ab.o(ab.o是一个名字)ab-objs:=a.o b.o(objs是固定的)执行时:a.c-->a.o b.c-->b.o a.o&b.o-->ab.ko2.顶层的makefile顶层的makefile中并没有找到uImage,原创 2014-01-06 16:03:57 · 1047 阅读 · 0 评论 -
内核启动过程的配置
1.制作内核的几个步骤A.解压缩B.打补丁C.配置(3种方法):make menuconfig、使用默认的配置,在上面修改(推荐)、使用厂家提供的配置文件D.编译注:查找默认配置文件:find -name "*defconfig*"2.配置内核的第二种方法详解在arch/arm/configs里面找到s3c2410与2440比较类似,所以选择使用这个来修改。执行ma原创 2014-01-05 11:19:23 · 699 阅读 · 0 评论 -
第五章 驱动开发_Nand flash启动 & Nor flash启动 & 时钟倍频
1.开发板通过配置的时钟一般较低,通过倍频器倍频得到高频率?这是因为CPU的主频是通过外频乘以倍频得来的,而外频是整个系统的基准频率,当外频提高时,如不作任何调整,PCI频率、内存频率、前端总线或HT总线频率等都会随之提升,因此有时就会出现超频后硬盘不正常的现象,在超频时往往锁定PCI频率并设置内存异步,就是这个原因。而对于倍频来说它与周边其它部件无关,提升倍频不会对它们造成影响,从另一方面原创 2014-01-03 21:50:29 · 1297 阅读 · 0 评论 -
第三章 驱动开发_fdisk命令 & cp命令 & 主次设备号
1. 使用linux下的fdisk工具进行分区。用root用户登录到你的linux系统,查看你系统的分区#fdisk -l会出现以下的信息:Device Boot Start End Blocks Id System/dev/sda1 * 1 64 512000 83 Linux/dev/sda2 64 2611 20458496 8e Linux LVM根据提示信息可以判断出此系原创 2014-01-03 21:50:25 · 767 阅读 · 0 评论 -
第一章 驱动开发_驱动开发基本知识
1. # 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首个参数返回为一个带引号的字符串.例如, 命令 #define to_string( s ) # s将会使编译器把以下命令 cout 理解为 cout 使用##连结##前后的内容. 例如, 命令#define concatenate( x, y ) x ## y...原创 2014-01-03 21:50:20 · 759 阅读 · 0 评论 -
第三章 裸机_第一个裸机程序(下)
1.在上一讲中,已经可以用make生成我们自己的二进制文件,现在需要将二进制文件下载到S3C2440中去运行。首先需要做的就是连接J-link,然后配置AXD。2.首先启动AXD Debugger:在XP的开始菜单中选择 程序->ARM Developer Suite ->AXD Debugger. 第一个裸机程序(下)" TITLE="第三章 第一个裸机程序(下)" />启动AXD原创 2014-01-03 21:50:14 · 973 阅读 · 0 评论 -
第二章 裸机_u-boot下载裸机程序以及ARM编程基础
1.使用u-boot下载裸机程序在笔记本没有并口和串口的情况下,使用u-boot下载裸机程序到nand flash主要分为以下几步:(1)下载u-boot到nor flash。(2)需要USB转串口线。(3)需要USB下载线。(4)设置超级终端。(5)安装DNW软件(三星公司出的ARM程序下载器)。DNW 在这里是我们的.bin 文件下载软件,可实现我们向flash或者内存当中烧写原创 2014-01-03 21:49:59 · 1511 阅读 · 0 评论 -
第一章 裸机_ADS和使用J-Link下载u-boot
1.ADS(ARM DevelopmentSuit)是ARM公司推出的嵌入式微控制器集成开发工具。ADS集成开发环境由命令行开发工具、ARM运行时库、GUI开发环境(CodeWarrior和AXD)组成。初学者一般使用的都是Code WarriorIDE集成开发环境和AXD调试器,这两个软件已经可以满足开发需求。2.Code Warrior for ARM集成了ARM汇编器、ARMC/C原创 2014-01-03 21:49:57 · 1465 阅读 · 0 评论 -
uboot分析之uboot启动过程分析
1.拿到uboot的源码之后,一般需要经过四个步骤:(1)解压缩(2)打补丁:patch -p? 解释:?用数字替代,表示忽略掉前几级目录。(3)配置:因为uboot可以支持很多种芯片,需要将其配置为支持特定的芯片解释:这一步一般就是执行make config,config是特定的一个配置文件。(4)编译2.在uboot下,如果想查看有哪些可用的命令,可以输入?或者输入原创 2013-12-30 15:54:25 · 876 阅读 · 0 评论 -
2440时钟&位置无关码
1.不同的外设需要的时钟频率不一样,所以时钟需要通过不同的分频送到每一个器件。2.CPU专用的时钟一般称为FCLK,这个一般是最高的频率,因为CPU的速率最快,很好理解的;HCLK是用于AHB总线,也就是高速外设总线,这上面外接的设备频率也比较快,当然也没有2440内核快;另一个就是PCLK用于APB,也就是低速外设总线,这个上面接的外设频率相对较低。2440芯片是一个SOC,除了920t的内原创 2013-12-12 12:03:32 · 811 阅读 · 0 评论 -
ADS链接脚本和makefile基础
1.ADS工程中的lds后缀的文件表示链接脚本。SECTIONS { . = 0x00; .text : {*(.text)} .rodata ALIGN(4) : {*(.rodata)} .data ALIGN(4) : {*(.data)} .bs ALIGH(4) : {*(.bss) *(COMMON)}}. =原创 2013-12-08 16:33:35 · 2173 阅读 · 0 评论