块设备驱动向LINUX移植的常规步骤及INITRD的使用
这里提到的块设备泛指各种可以实现固定大小数据随机传输的设备,如FLASH、SD Card、RAMDISK等,块设备驱动移植的过程实际上是将硬件厂商提供的底层驱动代码与LINUX系统集成起来的过程。
在LINUX中,块设备能够以文件系统的形式为OS所访问,其大体架构如下:
LINUX Application
---------------------------------- system call
LINUX VFS
----------------------------------
File System (vfat/ext2/cramfs..)
----------------------------------
Block Device Driver
---------------------------------- <-- Our working scope
LLD from vendor
----------------------------------
Hardware
移植的常规过程为:
1. 利用module_init宏将设备的初始化函数mydev_init注册到kernel镜像的.init段。当然,还要利用module_exit宏注册去初始化函数mydev_cleanup。(ref: linux/init.h)
2. 填充初始化函数mydev_init,完成以下三项工作
2.1 使用register_blkdev注册块设备号和设备名。 (ref: drivers/block/genhd.c)
2.2 设置queue:主要是获取queue并设置request函数,设置sector大小等。 (ref: drivers/block/ll_rw_blk.c)
2.3 添加disk:add_disk。 (ref: drivers/block/genhd.c)
涉及到的数据结构包括:
a) struct request_queue (ref: linux/blkdev.h), 2.2中的queue结构
b) struct gendisk (ref: linux/genhd.h), 2.3中的disk结构,关注成员 ->
major/first_minor/minors <- 设备号;
fops指针 <- 块设备操作函数指针组
queue指针 <- 2.2中的queue
private_data指针 <- 存储与具体设备相关的数据结构
c) struct mydev_dev,即b)中的具体设备相关的数据结构,通常包含成员
size <- 设备中sector的数目
users <- 使用设备的用户数目
media_change <- media change标记
lock <- 自旋锁
queue 指针 <- 设备的struct request_queue指针
disk 指针 <- 设备的struct gendisk指针
3. LINUX块设备驱动的操作函数指针组
open: 设备打开时被调用,主要功能为初始化底层设备;或取底层设备信息
release: 设备关闭时被调用。
ioctl: 实现ioctl系统调用的函数,由于大量的标准请求为上层截取,一般块设备的ioctl比较短小。
media_changed: 内核调用该函数以检查用户是否更换了驱动器内的介质,如果用户更换了,那么返回一个非零的值。这是针对可移动介质的。
revalidate_dis
相关文档:
1. HCI层协议概述:
HCI提供一套统一的方法来访问Bluetooth底层。如图所示:
从图上可以看出,Host Controller Interface(HCI) 就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。
在Host这一端:application,SDP,L2cap等协议 ......
Linux操作系统内核启动参数详细解析
Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。
如果不使用启动管理器,比如直接从BIOS或者把内核文件用“cp zImage /dev/ ......
Linux内核裁剪的具体步骤
在menuconfig中配置:
详细介绍内核配置选项及删改情况
第一部分:全部删除
Code maturity level options ---> 代码成熟等级选项
[]Prompt for development and/or incomplete code/drivers 默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.不 ......
什么是Socket
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix
系统的输入和输出的话,就很容易了解 ......