- 博客(43)
- 资源 (53)
- 收藏
- 关注
转载 Linux设备驱动之USB hub驱动
一:前言 继UHCI的驱动之后,我们对USB Control的运作有了一定的了解。在接下来的分析中,我们对USB设备的驱动做一个全面的分析,我们先从HUB的驱动说起。关于HUB,usb2.0 spec上有详细的定义,基于这部份的代码位于linux-2.6.25/drivers/usb/core下,也就是说,这部份代码是位于core下,和具体设备是无关的,因为各厂商的hub都是按照spec的要
2012-10-31 22:54:39 2248
转载 Linux设备模型之input子系统详解
一:前言 在键盘驱动代码分析的笔记中,接触到了input子系统。键盘驱动,键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析。 下面的代码是
2012-10-31 22:53:42 696
转载 Linux设备模型学习参考方法
看LDD3中设备模型一章,觉得思维有些混乱。这里从整体的角度来理理思路。 本文从四个方面来总结一些内容: 1.底层数据结构:kobject,kset. 2.linux设备模型层次关系:bus_type,device,device_driver. 3.集成:PCI设备驱动模型实例及设备,设备驱动注册源码的简单分析. 4.面向对象的思想在linux设备模型中的应用分析.
2012-10-31 22:52:36 470
转载 linux platform 驱动模型分析
一。 概述 platform设备和驱动与linux设备模型密切相关。platform在linux设备模型中,其实就是一种虚拟总线没有对应的硬件结构。它的主要作用就是管理系统的外设资源,比如io内存,中断信号线。现在大多数处理器芯片都是soc,如s3c2440,它包括处理器内核(arm920t)和系统的外设(lcd接口,nandflash接口等)。linux在引入了platform机制之后,内
2012-10-31 22:51:29 452
转载 Input子系统分析
1认识和使用 input 事件:1.1Linux input 驱动分类Input驱动程序是Linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)和事件设备(Event queue)3种驱动程序。其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。Input驱动程序的主设备号是13,驱动程序的设备号分配如下所示。 joy
2012-10-31 19:55:34 498
转载 remap_pfn_range()详解
remap_pfn_range()函数的原型:int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);该函数的功能是创建页表。其中参数vma是内核根据用户的请求自己填写的,而参数addr表示
2012-10-30 17:55:03 3418
转载 copy_to_user、copy_from_user 分析
在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成用户空间到内核空间的复制,函数copy_from_user()完成内核空间到用户空间的复制。下面我们来仔细的理一下这两个函
2012-10-30 14:37:30 737
转载 Linux进程的睡眠和唤醒
1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数schedule()是一个调度函数,它可以被一个进
2012-10-29 17:57:09 436
转载 OK6410——uboot
暑假在淘宝上买了一块OK6410板子,希望有空的时候研究一下,毕竟对这方面蛮感兴趣的。大致的计划,现了解linux系统,包括bootloader,kernel和cramfs。整个流程自己编译一遍,体验一下,希望从中能够学到点东西。好现在入正题。u-boot源代码的官方下载地址:点击打开链接1. 搭建开发平台采用ubuntu10.04,毕竟自己比较熟悉。第一步要安装交叉编译工具,
2012-10-28 22:24:30 616
原创 工作队列
定义: struct work_struct work;初始化: INIT_WORK(struct work_struct *work, void (*func)(struct work_struct *work));定义并初始化: DECLARE_WORK(name, void (*func)(struct work_struct *work));============
2012-10-24 14:15:10 490
原创 内核中断
#include int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) irq: 中断号 arch/arm/mach-s3c64xx/include/mach/irqs.h handler:
2012-10-24 14:14:38 536
原创 tasklet
定义: struct tasklet_struct t;初始化: void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long),unsigned long data);定义并初始化: DECLARE_TASKLET(t, void (*func)(unsigned long),unsig
2012-10-24 14:11:15 488
转载 #error 等其他常用预处理命令
#error 等其他常用预处理命令 #error 等其他常用预处理命令 除了上面介绍的之外,C语言还有#erroe、#line、#pragma 等其他常用的预处理命令,在很多C语言的程序中也是经常可见的。下面向读者简单介绍一下它们。1. #error #error 指令强制编译程序停止编译,它主要用于程序调试。#error 指令的一般形式是:#
2012-10-23 18:59:30 990
转载 C语言 预处理命令
1 概述 在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令#include,宏定义命令#define 等。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用
2012-10-23 18:57:37 623
转载 compiler.h & compiler-gcc.h分析
Linux的内核源码都会包含文件linux\compile.h,所以先分析该文件内的内容,作为开篇。1 汇编编译时不定义的内容 该文件的第一个内容是对宏__ASSEMBLY__的判断,这个宏的作用是避免在进行汇编编译的时候,不定义后续相关内容。这个宏通过在编译器中用-D选项中加入,参数AFLAGS也包含该宏定义。在汇编时编译器会定义__ASSEMBLY__为1。
2012-10-23 18:57:00 2217
原创 内核线程
创建内核线程: struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[]); 唤醒内核线程(可以唤醒所有进程(线程)): wake_up_process(struct task_struct *k);创建并运行内核线程: struc
2012-10-23 17:58:20 921
转载 GCC链接脚本
对于.lds文件,它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。虽然现在我还没怎么用它,但感觉还是挺重要的,有必要了解一下。先看一下GNU官方网站上对.lds文件形式的完整描述:SECTIONS {...secname start BLOCK(align) (NOLOAD) : AT ( ldadr ){ contents } >region :p
2012-10-23 15:13:16 1219
转载 x86和arm架构原子操作的区别
x86和arm在原子操作上有些差别,下面一代码的形式来说明区别:首先比较单核: 由于x86是CISC指令集,允许在一条指令里进行两次内存操作,所以对i++,i__这些操作在单核条件下是原子,当然必须得是显示使用addl r,%1这种,就可在一条指令里完成读,写操作。 而arm属于RISC指令集,在一次指令执行期间只能有一次内存操作,所以像i++,i--这些
2012-10-19 14:48:00 1177
原创 arm gcc内嵌汇编
arm gcc内嵌汇编=============================高级语言可以实现大部分编程功能,但是当我们需要对特定代码进行优化,写启动代码,或者操作特定硬件,或需要直接用CPU指令等等操作的时候我们需要用到汇编。但是我们只想在高级语言(比如C语言)中的某些特定部分插入某些汇编指令,这时候,我们就需要用高级语言提供的内嵌汇编功能。我们以arm gcc为例,用arm gcc进
2012-10-19 14:33:49 711
转载 原码、反码和补码
在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。1、原码、反码和补码的表示方法(1) 原码:在
2012-10-19 14:01:05 706
转载 原子操作的实现 ARM的SWP和LDREX STREX指令
早期的ARM指令集(V6前)提供SWP指令,该指令可原子交换寄存器和内存数据,用于实现信号量操作。 如下面这个例子: sem_wati:MOV R1,#0 LDR R0,=SEMSWP R1,R1,[R0] ;取出信号量,并设置其为0CMP R1,#0 ;判断是否有信号BEQ sem_wait ;若没有信号,则等待 SWP指令的缺点是会lock总线,
2012-10-19 12:12:19 2820
转载 LDREX and STREX
最近看linux关于atomic的实现的代码(asm/atomic.h)发现大量使用了LDREX和STREX(ARM体系结构),现将这两个指令的用法总结如下。详细用法 http://www.keil.com/support/man/docs/armasm/armasm_cihbghef.htm Syntax:LDREX{cond} Rt, [Rn {, #offset}]S
2012-10-19 10:37:31 1401
原创 内核竞态与抢占
最古老的操作系统是单进程的。后来出现了多任务操作系统,因为多进程在内核态中资源都是共享的,所以容易造成破坏,早期的进程调度器在内核态是不能被抢占的,在进入内核态的时候进程调度器停止调度,这样降低了内核的复杂程度。稳定性也相对较高,服务器中常用。更先进的内核,能够在内核态抢占,这就需要锁来保证内核线程间的同步以下用两段代码说明第一种 非竞态内核static int test_init(v
2012-10-18 18:18:04 763
转载 浅谈可变参数函数实现基本原理
浅谈可变参数函数实现基本原理 核心提示:对于可变参数函数获取其可变的参数,我们可以用下列宏来得到: #include voidva_start(va_listap,last); typeva_arg(va_listap,type); voidva_end(va_listap); void&...对于可变参数函数获取其可变的参数,我们可以用下列宏来
2012-10-17 12:13:58 419
转载 揪出gcc默认使用的ld链接脚本
揪出gcc默认使用的ld链接脚本 核心提示:首先声明不是讲lds语法的 在>一书中曾提到ld默认使用的链接脚本 说默认在/usr/lib/ldscripts/下 结果我找了半天没找到我的系统是fedora8 find/-name*lds*找不到...首先声明不是讲lds语法的 在 >一书中曾提到ld默认使用的链接脚本 说默认在/usr
2012-10-17 12:13:07 6968
转载 c函数库与gcc链接命令
使用math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。本书用到的大部分库函数(例如printf)位于libc.so库文件中,使用libc.so中的库函数在编译时不需要加-lc选项,当然加了也不算错,因为这个选项是gcc的默认选项。
2012-10-17 12:11:18 1416
原创 字符杂项设备 misc_register
字符杂项设备 misc_register #include #include #include #include /* misedevice 结构:struct miscdevice { int minor; //次设备号,若为 MISC_DYNAMIC_MINOR 自动分配 const char *name; //设备名
2012-10-17 00:00:08 727
转载 windows xp下 usb驱动编写
一,概述现在很多的主控上都带有USB的功能,但是对于初学者来说,这方面应用还是比较棘手,因为usb的不但固件程序需要编写,PC端的驱动也要编写,而且驱动写好了还要写个上位机才能看出效果。这样调试起来十分困难,建议从USB的键盘,鼠标开始做,了解清楚了,再做自己的协议就比较简单了。USB的概念历史啥的这里就不说了。我们先不管具体的数据包格式,这一节先从整个包的层面上简单的说,过程是这样的,
2012-10-16 23:52:02 1171
转载 使uboot支持S3C6410的SD启动(转载)
6410的手册上说,可以从nandflash、onenand、SD卡启动,没有专用的烧录工具的情况下,只有SD卡启动是可以考虑 的。手册上看到,SD卡启动,实际上是先执行片内IROM中的一段程序,该程序从SD卡中读取代码,写到stepping stone 中,stepping stone是位于0x0c000000、size为8K的片内内存,代码写入stepping stone后,跳到 0x0c00
2012-10-16 22:59:19 674
转载 分析内核中的current宏,并自己实现
说明: current宏,是一个全局指针,指向当前进程的struct task_struct结构体,即表示当前进程。 例如current->pid就能得到当前进程的pid,current-comm就能得到当前进程的名称。 每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。 当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用
2012-10-16 22:57:30 6892
转载 Makefile详解
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一
2012-10-15 14:26:10 773
转载 Module_init揭秘
在Linux底下写过driver模块的对这个宏一定不会陌生。module_init宏在MODULE宏有没有定义的情况下展开的内容是不同的,如果这个宏没有定义,基本上表明阁下的模块是要编译进内核的(obj-y)。1.在MODULE没有定义这种情况下,module_init定义如下:#define module_init(x) __initcall(x);因为#define __ini
2012-10-15 12:34:31 387
转载 Boost.Typeof实现分析
typeof的功能是获取一个表达式的类型,实现的问题在哪里呢?问题就在于需要获取的是一个静态的类型,我们可以用typedef从一个类型找到另外一 个类型,可以用模板从一个类型运算出另一个结果,但是归根到底还是需要用别的类型作为模板参数。然而,我们面临的问题是,起始条件只有表达式,这个表达式 不是常数,问题的关键就是获取跟表达式类型有关联的一个常数,然后再把这个常数作为模板参数,算出相对应的类型,而
2012-10-14 21:30:44 1134
转载 container_of()宏
在学习Linux驱动的过程中,遇到一个宏叫做container_of。该宏定义在include/linux/kernel.h中,首先来贴出它的代码:/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the
2012-10-14 21:00:37 378
转载 指针常量和常量指针
一:指针常量和常量指针常量指针:常量指针就是指向常量的指针,指针所指向的地址的内容是不可修改的。指针常量定义"const int * pi=&a;"告诉编译,*pi是常量,不能将*pi作为左值进行操作。所以这里的指针还是一个变量,它的内容存放的是常量的地址。例如:定义常量指针 const int *p定义两个整型变量int a; int b;把 a和b进行赋值 a
2012-10-14 17:43:33 438
转载 printk()函数的总结
我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况。对程序的调试起到了很重要的作用。(下文中的日志级别和控制台日志控制级别是一个意思)printk(日志级别 "消息文本");这里的日志级别通俗的说指的是对文本信息的一种输出范围上的指定。日志级别一共有8个级别,printk的日志级别定义如下(在linux26/
2012-10-13 18:12:24 453
转载 字符设备驱动程序
一、主设备号和此设备号主设备号表示设备对应的驱动程序;次设备号由内核使用,用于正确确定设备文件所指的设备。内核用dev_t类型()来保存设备编号,dev_t是一个32位的数,12位表示主设备号,20为表示次设备号。在实际使用中,是通过中定义的宏来转换格式。(dev_t)-->主设备号、次设备号MAJOR(dev_t dev)MINOR(d
2012-10-13 16:18:42 604
原创 linux内核模块学习笔记
########## Makefile ##########obj-m := modname.o 编译完会有modname.ko当前目录下必须有modname.[c/s/S]文件obj-m的值有多少个*.o就会有多少个*.ko++++++++++++++++++++++++++++++多文件:obj-m := modname.omodname-objs := 1.o
2012-10-12 12:30:51 669
原创 kconfig 语法简要
文档: kernel/Documentation/kbuild/kconfig-language.txtKconfig句法 config menuconfig choice/endchoice comment menu/endmenu if/endif source mainmenu菜单属性 bool/boolean tristate string
2012-10-12 12:29:53 725
原创 linux内核添加系统调用
可在任意位置实现函数 asmlinkage long sys_函数名(参数) { } or #include SYSCALL_DEFINEx(函数名, type1, name1, type2, name2, ...) x 表示参数个数, 函数名前面会自动加上sys_ { }linux/arch/arm/kernel/call.S CA
2012-10-12 12:27:42 719
强大的右键管理工具
2017-09-08
split_bootimg.pl 解包boot.img initramfs ramdisk工具
2015-09-06
autoit3.zip
2013-05-16
存储服务器rootfs 1.02
2013-04-06
存储服务器rootfs
2013-04-06
嵌入式rootfs
2013-04-03
H.264Dec-Encode
2013-03-14
zlib-1.2.3.tar.gz
2013-03-08
dropbear-0.52.tar.gz
2013-03-08
linux usb摄像头源代码
2013-03-07
s3c6410 自制 uboot 源代码 第二版 2.0
2012-10-11
s3c6410 自制 uboot 源代码
2012-10-10
reqPackages.rar
2012-05-23
Nitro Pro 7 破解 PDF编辑制作工具
2012-04-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人