Linux 驱动学习
文章平均质量分 82
xxu0123456789
热情豪爽
展开
-
i.mx6quard uboot 之nand
uboot分析原创 2024-03-16 20:05:31 · 652 阅读 · 0 评论 -
时钟五
看了好多人分析了软件时钟部分,我也凑一下热闹吧,之前有说道软件时钟在何处执行的,在系统时钟中断里,执行的函数在init_timers中定义了open_softirq(TIMER_SOFTIRQ, run_timer_softirq); //初始化软中断函数 主意这里的是定时器软中断,开来还有其他软中断啊void open_softirq(int nr, void (*action)(原创 2012-09-21 16:25:30 · 716 阅读 · 0 评论 -
时钟三
时钟机制的,使用通知链技术来执行。通知链技术,时钟源建立一个链表,然后待发生的事件将自己要执行的操作注册到链表上,简单吧,呵呵通知链有好多种:原子通知链( Atomic notifier chains ):通知链元素的回调函数(当事件发生时要执行的函数)只能在中断上下文中运行,不允许阻塞 可阻塞通知链( Blocking notifier chains ):通知链元素的回调函数在进原创 2012-09-21 16:25:09 · 652 阅读 · 0 评论 -
时钟二
内核中使用struct clocksource描述时钟源,使用clocksource_list来维护struct clocksource;使用struct clock_event_device来描述时钟发生的时间;使用clockevent_devices来维护struct clock_event_device;/include /linux/clocksource.h/**原创 2012-09-21 16:24:56 · 597 阅读 · 0 评论 -
时钟四
接下来该分析time_init了/arch/arm/kernel/time.cvoid __init time_init(void){#ifndef CONFIG_GENERIC_TIME if (system_timer->offset == NULL) system_timer->offset = dummy_gettimeo原创 2012-09-21 16:25:21 · 1507 阅读 · 1 评论 -
时钟一
一切皆非难事,只要有恒心,蚂蚁也可啃掉大象,今天开始分析一下linux里的时钟机制。首先贴一下该是的启动Linux 部分asmlinkage void __init start_kernel(void){ char * command_line; extern struct kernel_param __start___param[], __stop原创 2012-09-21 16:23:34 · 677 阅读 · 0 评论 -
L三
整体架构分析LCD 本为字符设备,fbmem.c中定义了各项fbmem_init frambuffer_register等其中fbmem_init如下 1654 1655 static int __init 1656 fbmem_init(void) 1657 { 1658 proc_create("fb", 0, NULL, &f原创 2012-09-17 15:29:55 · 1076 阅读 · 0 评论 -
L二
接上文,看完了结构体,也也应该知道个大概了,整个驱动部分围绕fb_info来,对其进行填充最后调用frambuffer_register将其注册进内核,接下来看详细分析: 426 static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) 427 { 428原创 2012-09-17 15:30:45 · 3471 阅读 · 0 评论 -
iic二
一、driver/i2c/i2c-core.cstatic int __init i2c_init(void){ int retval; retval = bus_register(&i2c_bus_type); if (retval) return retval; retval =原创 2012-09-20 14:58:16 · 533 阅读 · 0 评论 -
L一
mx51 LCD driver 分析以下为要用到的结构体struct mxcfb_data { struct fb_info *fbi; struct fb_info *fbi_ovl; volatile int32_t vsync_flag; wait_queue_head_t vsync_wq;原创 2012-09-17 15:31:05 · 1290 阅读 · 0 评论 -
iic三
int i2c_add_numbered_adapter(struct i2c_adapter *adap){ int id; int status; if (adap->nr & ~MAX_ID_MASK) return -EINVAL;retry: if (idr_原创 2012-09-20 14:58:32 · 658 阅读 · 0 评论 -
the application of pointer
Today , the pointer waste me amounts of time;Last , I find the errror is where when I define the locatedpointer, but I can't assignment the first value, so , when I call it any time, the vlau原创 2012-05-30 12:27:02 · 398 阅读 · 0 评论 -
SPI驱动分析之二
SPI驱动分析二原创 2024-03-16 20:00:03 · 717 阅读 · 1 评论 -
SPI驱动分析之三
SPI驱动分析三原创 2024-03-16 20:00:55 · 868 阅读 · 1 评论 -
SPI驱动分析之一
SPI驱动分析一原创 2024-03-16 19:58:49 · 894 阅读 · 1 评论 -
iic一
struct i2c_client { unsigned short flags; /* div., see below */ unsigned short addr; /* chip address - NOTE: 7bit */原创 2012-09-20 14:58:07 · 540 阅读 · 0 评论 -
ubuntu11.04
亏我一直用11.04用了那么久,偶尔一天重装系统,尼玛什么中文都不显示,设置IBUS输入,无效,更新无效,第二天重启电脑,尼玛,图形界面彻底崩掉,直接终端模式爹啊,折腾了许久,果断更新到11.10,看了下11.10也不是LTS版,先有着吧,以后再更新到12.04LTS版原创 2014-01-08 19:24:00 · 709 阅读 · 0 评论 -
内存映射
linux中的物理地址和虚拟地址 在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同。Linux运行在虚拟存储空间,并负责把系统中实际存在的远小于4GB的物理内存根据不同需求映射到整个4GB的虚拟存储空间中。n物理存储空间布局Li转载 2011-11-19 11:17:56 · 11668 阅读 · 2 评论 -
中断六
继续分析asm_do_IRQ里的irq_exit/kernel/softirq.c/* * Exit an interrupt context. Process softirqs if needed and possible: */void irq_exit(void){ account_system_vtime(current); //空函数includ原创 2012-10-08 10:09:29 · 831 阅读 · 0 评论 -
serial 架构分析
一、首先看一下uart_register_driver();int uart_register_driver(struct uart_driver *drv){ struct tty_driver *normal = NULL; int i, retval; BUG_ON(drv->state); /* * Ma原创 2012-08-16 15:23:16 · 737 阅读 · 0 评论 -
tty serial 架构分析
一、 tty设备,在用户空间看来也为字符型设备,从tty_register_driver()中可以看出 int tty_register_driver(struct tty_driver * driver) { ... cdev_init(&driver->cdev, &tty_fops);原创 2012-08-16 14:03:38 · 1370 阅读 · 0 评论 -
struct 结构体内存对齐方式
以下都以32位机器为例分析结构体类型的变量在内存里的存储:一、 1. 结构体变量的存储位置都是在内存中寻找地址是该变量自身大小整数倍开始存储的。 2. 结构体类型变量的总大小应是该类型成员中最大数据类型的整数倍。 就此两点,可以解决所有问题, 对于第一条,应该注意每一位成员存放的首地址定为自身的整数倍。 例子如下: struct X原创 2012-08-15 09:24:29 · 608 阅读 · 0 评论 -
build the kernel
On 11/20/2010 01:41 PM, Stuart Hughes wrote:Hi Rob,Unfortunately I'm short of time so I can't go back and look in detail,but I recall someone posting a similar issue recently.I think the iss转载 2012-05-06 22:59:26 · 491 阅读 · 0 评论 -
assemble instrument of avr controller
原创 2012-04-27 16:18:04 · 375 阅读 · 0 评论 -
优先级运算符
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .成员选择(对象)对象.成员名原创 2012-04-16 12:24:57 · 673 阅读 · 0 评论 -
android 按键
分析一下 Android 是如何读取按键及Touch Panel 的驱动的。主要在$(ANDROID_DIR)/frameworks/base/libs/ui/EventHub.cpp这个文件中,这是在 HAL 层,将一步步分析 Android 上层是如何接受事件的。 一, 先看一下 Android HALClass EventHub 在 $(ANDROID_DIR)/frameworks/base/include/ui/eventhub.h 定义. i. scan_dir(const char *dir原创 2011-03-28 13:40:00 · 2311 阅读 · 0 评论 -
platform_device
<br />1.1 platform总线、设备与驱动<br />在Linux 2.6的设备驱动模型中,关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。<br />一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2 C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空转载 2011-02-14 17:15:00 · 3343 阅读 · 0 评论 -
USB驱动编写指南
<br />概念:模块和设备文件。<br /> 模块:是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。Linux下对于一个硬件的驱动,可以有两种方式:直接加载到内核代码中,启动内核时就会驱动此硬件设备。另一种就是以模块方式,编译生成一个.ko文件(在2.4以下内核中是用.o作模块文件,我们以2.6的内核为准,以下同)。当应用程序需要时再加载到内核空间运行。原创 2011-02-14 16:56:00 · 5328 阅读 · 0 评论 -
驱动与设备的匹配
至此已不想说多少了,以后路还远着了,现在说多了,以后看来就都变成废话了,所以大家直接看下面代码吧int driver_register(struct device_driver *drv) { int ret; struct device_driver *other; BUG_ON(!drv->bus->p); if ((drv->bu原创 2012-08-20 14:00:39 · 1377 阅读 · 0 评论 -
设备与驱动的匹配
看了许久,今天终于是了解了驱动及设备的注册及彼此的绑定过程,详细内容请见下文,如有不对地方请指正,多谢了!一、 先看一下这个int __init devices_init(void) { devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); if (!devices原创 2012-08-20 13:32:47 · 2379 阅读 · 0 评论 -
中断二
依然从start_kernel开始,里面调用了四个涉及中断的函数,如下:1、trap_init();2、early_trap_init();3、init_IRQ();4、softirq_init();下面来一个一个分析1、trap_init()arch/arm/kernel/trap.cvoid __init trap_init(void){原创 2012-10-08 10:08:30 · 744 阅读 · 0 评论 -
中断五
其实废话一点都不想说,网上有人写了一大堆,搜搜一大把,想想还是写点自己的东西吧,可以熟悉一下,方便以后查阅贴一下之前有分析过的一段代码 arch/arm/kernel/trap.cvoid __init early_trap_init(void){ unsigned long vectors = CONFIG_VECTORS_BASE; ex原创 2012-10-08 10:09:16 · 683 阅读 · 0 评论 -
中断一
struct irq_desc { unsigned int irq; struct timer_rand_state *timer_rand_state; unsigned int *kstat_irqs;#ifdef CONFIG_INTR_REMAP struct irq_原创 2012-10-08 10:08:13 · 598 阅读 · 0 评论 -
clk_register
之前写了那么多关于系统时钟的机制,说到底,就那么回事,初始化系统时钟,初始化软中断,以及初始化那个tvec_base,就这些,其他的也没有什么了,这篇主要关于每个外部设备的时钟的初始化,及获取。 首先贴上源码arch/arm/mach-s3c64xx/mach-smdk6410.c 1145 MACHINE_START(SMDK6410, "SMDK6410") 114原创 2012-10-08 10:09:55 · 2004 阅读 · 0 评论 -
接口
LCD接口分类 1. I8080接口,我觉得应该就是所谓的8080,通常会用在12864屏上面,且有内部sdram,不需要实时的刷新图片,速度有限制, 支持的数据宽度有8/9/16/18bit,接口连接如下 稍微说一下引脚RS引脚表示数据还是命令,CS表示片选信号,/WR表示写,/RD表示读 2.M6800接口,哪些屏上会有我就不原创 2012-09-12 17:06:09 · 974 阅读 · 0 评论 -
ldr adr区别
ldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr_start: nop 编译的时候设置 RO 为 0x0c008000↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓原创 2012-09-07 16:21:26 · 680 阅读 · 0 评论 -
shell 脚本
1,、 shell 里用 # 作为 comment。2、shell 里开始的 #! 并不代表comment, 他代表次脚本要被那个解释器解读。3、shell 里变量的定义使用, example: VAR=2 echo "$VAR" (comm原创 2012-05-08 08:57:13 · 498 阅读 · 0 评论 -
Makefile
linux基础之Makefile 收藏<br />1:作用<br />Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好转载 2011-03-01 09:57:00 · 654 阅读 · 0 评论