驱动笔记++++++汉艾尔特

来源:互联网 发布:mac localhost打不开 编辑:程序博客网 时间:2024/06/10 07:48
第一周:
Android 手机开机后,会先运行 bootloader。 Bootloader 会根据某些判定条件(比如按某个特殊键)决定是否进入 recovery 模式。
Recovery 模式会装载 recovery 分区,  该分区包含recovery.img。recovery.img 包含了标准内核(和boot.img中的内核相同)以及 recovery 根文件系统。
boot.img是一种特殊的Android定制格式,由boot header,压缩的内核,ramdisk以及second stage loader(可选)组成

ramdisk-recovery文件系统是TARGET_PRODUCT_OUT/recovery/root的压缩。TARGET_PRODUCT_OUT/recovery/root是在build/core/Makefile定义生成。
在recovery/root/init和root/init是同一个可执行文件,都是内核启动后执行的第一个进程

misc=>开机启动动画60k。cache=》OTA更新用的分区 cache/recovery/command,/cache/recovery/intent,/cache/recovery/log
Bootloader –>Boot(Kernel) –> init –>zygote –> SystemServer。设置了一系列的环境变量,重启后会根据设置的uboot环境变量进入不同的模式 从而实现升级 还原等一系列操作
    
android rom可以说是系统固件。是给系统升级用的。Firmware是一种软件的代名词,它是一种固化在集成电路内部的代码,而集成电路的功能就是由这些程序决定的。ROM不过只是Firmware的载体,而我们通常所说的BIOS正是固化了系统主板Firmware的ROM芯片。
rom相当于电脑硬盘。ram相当于电脑内存。firmware相当于电脑操作系统。BIOS是被固化在ROM(只读存储器)芯片的一组程序=>firmwarePOST(Power on Self Test 上电自检)

NAND Flash和NOR Flash是目前市场上两种主要的非易失闪存芯片。应用程序可以直接在FIash闪存内运行,不必再把代码读到系统RAM中。NAND Flash更适合于大容量数据存储的嵌入式系统。
RAM有两大类,一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快非常昂贵.CPU的一级缓冲,二级缓冲. 另一种称为动态RAM(Dynamic RAM/DRAM),计算机内存就是DRAM的。
FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM的优势),U盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统.

linux内核众子系统的初始化,并在过这 程中发现了初始化段的存在,利用初始化段实现了该功能
执行过程:start_kernel->rest_init系统在启动后在rest_init中会创建init内核线程init->do_basic_setup->do_initcall 中会把.initcall.init.中的函数依次执行一遍:这个__initcall_start是在文件<arch/xxx/kernel/vmlinux.lds.S>定义的

内核在启动时已经检测到了系统的硬件设备,由系统初始化脚本挂载到/sys上,生成对应的硬件设备文件。
匿名共享内存(ashmem)为进程间提供大块共享内存,为内核提供回收和管理这个内存的机制。PMEM(Physical),向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。

Linux的中断宏观分为两种:软中断和硬中断。声明一下,这里的软和硬的意思是指和软件相关以及和硬件相关,而不是软件实现的中断或硬件实现的中断。Linux通过信号来产生对进程的各种中断操作
驱动通过request_irq和free_irq来申请和释放中断号。
调用request_irq的正确位置应该是在设备第一次打开,硬件被告知产生中断之前;调用free_irq的正确位置应该是在最后一次关闭设备,硬件被告知不要再中断处理之后。
汇编语言(Assembly Language)是面向机器的程序设计语言.汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。

I2C有两根线的半双工的串线,SDA-数据线,SCL-时钟线. SCL高的时候,SDA数据有效,SCL SDA都高,表示总线处于等待状态.SCL高 SDA由高向低,表示传输开始,反之则表示传输结束.
同一条 I2C 总线上可以挂接很多个器件,一般可达数十个以上,甚至更多。器件之间是靠不同的编址来区分的,而不需要附加的 I/O 线或地址译码部件。带有 I2C 总线的器件除了有从机地址(Slave Address)外,还可能有子地址。从机地址是指该器件在 I2C 总线上被主机寻址的地址,而子地址是指该器件内部不同部件或存储单元的编址。
GPIO:General Purpose InputOutput(通用输入/输出)简称为GPIO或总线扩展器,当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO提供额外的控制监视功能。

driver和device是两个软件上的概念,每个driver对应一个主设备号,每个device对应一个次设备号。adapter和client是两个硬件上的概念。adapter对于嵌入式而言相当于我们板子上的i2c控制器,这个控制器可以根据我们的要求产生i2c时序。client是对于嵌入式而言相当于于个支持i2c的设备。
i2c-core.c相当于提供了一个可用的函数库,供处部调用,因此我们在里面经常看到的就是:EXPORT_SYMBOL();这个宏将这些函数作为符号导出,使其它文件中的函数可以使用,而不必包含相应的头文件。

i2c_client对应一个真实的物理设备,则把探测到的i2c_client->adapter指向其依附的适配器,,把i2c_client->driver指向其依附的 i2c_driver结构bus_for_each_drvice正是通过这个成员找到所有驱动,并执行一次i2c_do_add_adapter.也即执行drv->attach_adapter
led-dev.c 一、注册一个字符设备驱动。二、向sysfs注册了一个类。三、向上添加了一个驱动结构=>i2c-core.c对于一个驱动程序有两个元素不可或缺,即设备和驱动,一般驱动都是通过设备名和驱动名的匹配建立关系的。i2c-dev.c并没有针对特定的设备而设计,只是提供了通用的read()、write()和ioctl()等接口
i2c_driver对应一套驱动方法,是纯粹的用于辅助作用的数据结构,它不对应于任何的物理实体。i2c_client对应于真实的物理设备,每个I2C设备都需要一个i2c_client来描述。

i2c_transfer()函数本身不具备驱动适配器物理硬件完成消息交互的能力,它只是寻找到i2c_adapter对应的i2c_algorithm,并使用i2c_algorithm的master_xfer()函数真正驱动硬件流程
设备驱动要使用i2c_driver和i2c_client数据结构并填充其中的成员函数,I2C设备模块=> i2c_adapter; i2c-client,即i2c从设备从机,这个东西代表的是接到s3c2440芯片上的设备
通过register_chrdev()函数将I2C设备注册为一个字符设备。Aaron add=>i2c_register_board_info:  name:pm8058-core, addr:0x55, bus:6=>i2c_device.board_info.addr

模块加载时会在/sys/class/中创建名为hello_class的逻辑设备,在/dev/中创建hello的物理设备文件。一个逻辑设备总是对应于一个物理设备,但是一个物理设备却可能对应于多个逻辑设备。驱动模块加载时负责自动创建设备类别和设备文件。这个功能有两个步骤,创建设备类别文件class_create();   创建逻辑设备文件device_create();i2c_client随着设备文件的打开而产 生,并随设备文件的关闭而撤销,。i2c-dev.c针对每个I2C适配器生成一个主设备为89的设备文件,实现了i2c_driver的成员函数以及文件操作接口。
和设备交互的数据我们总称为“数据”,但是大致可划分为两种:“功能数据”:我们要输入设备处理的和设备处理完之后输出的数据。“控制数据”:我们用来控制设备特性功能的命令和参数。

I2C驱动体系结构有相当的复杂度,它主要由3部分组成,即I2C核心、I2C总线驱动和I2C设备驱动。I2C核心是I2C总线驱动和I2C设备驱动的 中间枢纽,它以通用的、与平台无关的接口实现了I2C中设备与适配器的沟通。I2C总线驱动填充i2c_adapter和i2c_algorithm结构 体,I2C设备驱动填充i2c_driver和i2c_client结构体。
i2c-dev.c文件定义的主设备号为89的设备可以给应用程序提供读写I2C设备寄存器的能力,IIC总线用于连接微处理器及其外围设备。i2c_add_adapter将这模块注册到操作系统里,总线驱动就算装上了。

发光二极管简称为LED。LED 是英文 light emitting diode(发光二极管)的缩写,它的基本结构是一块电致发光的半导体材料.LED显示屏(LED display):是由LED点阵组成,通过红色或绿色灯珠的亮灭来显示文字、图片、动画、视频,内容可以随时更换,各部分组件都是模块化结构的显示器件。
MCU(Micro Control Unit)中文名称为微控制单元,又称单片微型计算机(Single Chip Microcomputer)或者单片机,是指随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制常见存储器件。

在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
启动信号是一种电平跳变时序信号,而不是一个电平信号。启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态。只有在SCL为低电平期间,才允许SDA上的电平改变状态。逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时)

总线传送的每1帧数据均是1个字节。在启动总线后的第1个字节的低7位是对从机的寻址地址,第8位为方向位(“0”表示主机对从机的写操 作;“1”表示主机对从机的读操作),其余的字节为操作数据.在I2C总线发送起始信号后,发送从机的7位寻址地址和1位表示这次操作性质的读写位,在有应答信号后开始传送数据,直到发送停止信号。主机每发送1个字节就要检测SDA线上有没有收到应答信号,有则继续发送,否则将停止发送。
    
I2C-core框架:提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理.
I2C总线驱动只是提供了对一条总线的读写机制,本身并不会去做通信。通信是由I2C设备驱动来做的,设备驱动透过I2C总线同具体的设备进行通讯。一个设备驱动有两个模块来描述,struct i2c_client和struct i2c_driver。i2c_client用来描述一个具体的I2C设备,i2c_driver结构提供了i2c_adapter与 i2c_client之间的通信方式。
attach_adapter利用适配器驱动提供的I2C总线访问方法,利用设备驱动程序模块中提供的地址线索信息,检测可能存在的设备及其地址。如 果成功发现设备,则创建一个struct i2c_client来标识这个设备,并向该适配器的数据结构注册。detach_client用于从总线上注销设备、并释放i2c_client及相应 的私有数据结构。command是用户接口中的ioctl功能的底层实现。

LED的特性曲线就像二极管的一样,在工作范围内,电压相差一点,电流变化很大,而且LED的亮度是由电流控制的,如果用恒压的话,亮度会导致很难控制。LED不像普通的白炽灯泡,可以直接连接220V的交流市电。 LED是2~3伏的低电压驱动,必须要设计复杂的变换电路,不同用途的LED灯,要配备不同的电源适配器。
电流信号:在规定负载阻抗范围内(一般500、250欧以下),电流恒定,电压随负载变化而变化。 电压信号:在规定负载阻抗范围内(一般5K、10K欧以上),电压恒定,电流随负载变化而变化。

每一个I2C适配器都被分配一个设备,主设备号都为89,次设备号为0~255。应用程序通过 “i2c-%d” 文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等来访问这个设备。
i2c-dev.c并没有针对特定的设备而设计,只是提供了通用的read()、write()和ioctl()等接口,应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器并控制I2C设备的工作方式。i2c_adapter 对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法。

第六周
fd = open(argv[1], O_RDWR);ioctl(fd, I2C_SLAVE, 0x50); /* 设置eeprom地址 */ write(fd, &tmp.addr, 2); read(fd, &buf[idx], 1);close(fd);
platform_driver_register()注册过程
在really_probe()中:为设备指派管理该设备的驱动:dev->driver = drv, 调用probe()函数初始化设备:drv->probe(dev)
platform_device该结构一个重要的元素是 resource ,该元素存入了最为重要的设备资源信息.驱动注册时需要匹配内核中所以已注册的设 备名。
arch_initcall 的优先级高于 module_init 。所以会在 Platform 驱动注册之前调用。
只有找到相同的名称的 platfomr_device 才能注册 成功,当注册成功时会调用 platform_driver 结构元素 probe 函数指针,


原创粉丝点击