linux 简单驱动(ubuntu安装usb驱动安装)
很多朋友对于linux 简单驱动和ubuntu安装usb驱动安装不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
Linux驱动程序开发实例的目录
前言
第1章 Linux设备驱动程序模型 1
1.1设备驱动程序基础 1
1.1.1驱动程序的概念 1
1.1.2驱动程序的加载方式 2
1.1.3编写可加载模块 3
1.1.4带参数的可加载模块 5
1.1.5设备驱动程序的分类 6
1.2字符设备驱动程序原理 7
1.2.1 file_operations结构 7
1.2.2使用register_chrdev注册字符
设备 9
1.2.3使用cdev_add注册字符设备 11
1.2.4字符设备的读写 13
1.2.5 ioctl接口 14
1.2.6 seek接口 16
1.2.7 poll接口 18
1.2.8异步通知 22
1.3 proc文件系统 24
1.3.1 proc文件系统概述 24
1.3.2 seq_file机制 25
1.3.3使用proc文件系统 27
1.4块设备驱动程序 32
1.4.1 Linux块设备驱动程序原理 32
1.4.2简单的块设备驱动程序实例 35
1.5网络设备驱动程序 39
1.5.1网络设备的特殊性 39
1.5.2 sk_buff结构 40
1.5.3 Linux网络设备驱动程序架构 42
1.5.4虚拟网络设备驱动程序实例 46
1.6 Linux 2.6设备管理机制 50
1.6.1 kobject和kset 50
1.6.2 sysfs文件系统 51
1.6.3设备模型层次 52
1.6.4 platform的概念 54
第2章 Linux内核同步机制 58
2.1锁机制 58
2.1.1自旋锁 58
2.1.2读写锁 60
2.1.3 RCU 61
2.2互斥 64
2.2.1原子操作 64
2.2.2信号量 65
2.2.3读写信号量 67
2.3等待队列 68
2.3.1等待队列原理 68
2.3.2阻塞式I/O实例 68
2.3.3完成事件 70
2.4关闭中断 71
第3章内存管理与链表 72
3.1物理地址和虚拟地址 72
3.2内存分配与释放 72
3.3 IO端口到虚拟地址的映射 73
3.3.1静态映射 73
3.3.2动态映射 75
3.4内核空间到用户空间的映射 76
3.4.1内核空间到用户空间的地址
映射原理 76
3.4.2 mmap地址映射实例 78
3.5内核链表 80
3.5.1 Linux内核中的链表 80
3.5.2内核链表实例 81
第4章延迟处理 83
4.1内核线程 83
4.2软中断机制 85
4.2.1软中断原理 85
4.2.2 tasklet 87
4.3工作队列 89
4.3.1工作队列原理 89
4.3.2工作队列实例 91
4.4内核时间 92
4.4.1 Linux中的时间概念 92
4.4.2 Linux中的延迟 93
4.4.3内核定时器 93
第5章简单设备驱动程序 96
5.1寄存器访问 96
5.1.1 S3C6410地址映射 96
5.1.2 S3C6410看门狗驱动程序实例 98
5.1.3 S3C6410蜂鸣器驱动程序实例 102
5.2电平控制 107
5.2.1 S3C6410 LED驱动程序实例 107
5.2.2扫描型S3C6410按键驱动
程序实例 109
5.3时序产生 112
5.3.1时序图原理 112
5.3.2 AT24C02芯片原理 112
5.3.3 AT24C02驱动程序开发实例 115
5.4硬中断处理 123
5.4.1硬中断处理原理 123
5.4.2中断型S3C6410按键驱动
程序实例 127
5.5 Linux I/O端口控制 132
5.5.1 Linux I/O端口读写 132
5.5.2在应用层访问Linux I/O
端口 133
5.5.3/dev/port设备 134
第6章深入Linux内核 135
6.1嵌入式Linux系统构成 135
6.2 Linux内核导读 136
6.2.1 Linux内核组成 136
6.2.2 Linux的代码结构 137
6.2.3内核Makefile 138
6.2.4 S3C6410硬件初始化 139
6.3 Linux文件系统 141
6.3.1虚拟文件系统 141
6.3.2根文件系统 143
6.3.3文件系统加载 143
6.3.4 ext3文件系统 145
6.4 Flash文件系统 145
6.4.1 MTD设备 145
6.4.2 MTD字符设备 148
6.4.3 MTD块设备 150
6.4.4 cramfs文件系统 153
6.4.5 JFFS2文件系统 153
6.4.6 YAFFS文件系统 155
6.4.7文件系统总结 156
6.5 Linux内核移植 156
6.5.1体系配置 156
6.5.2添加yaffs2 157
6.5.3 Nand flash驱动程序移植 157
6.5.4配置启动参数 159
6.5.5移植RTC驱动程序 160
6.6根文件系统制作 162
6.6.1 Busybox 162
6.6.2 shell基础 165
6.6.3根文件系统构建实例 166
6.7 udev模型 167
6.7.1 udev模型原理 167
6.7.2 mdev的使用 167
第7章 I2C总线驱动程序 169
7.1 Linux的I2C驱动程序架构 169
7.1.1 I2C适配器 169
7.1.2 I2C算法 170
7.1.3 I2C驱动程序结构 170
7.1.4 I2C从设备 171
7.1.5 i2c-dev设备层 171
7.2 Linux I2C驱动程序开发 174
7.2.1 S3C2410X的I2C控制器 174
7.2.2 S3C2410X的I2C驱动程序
分析 175
7.3 S3C2410的I2C访问实例 182
7.4 I2C客户端驱动程序 185
第8章 TTY与串口驱动程序 190
8.1 TTY概念 190
8.2 Linux TTY驱动程序体系 190
8.2.1 TTY驱动程序调用关系 190
8.2.2 TTY驱动程序原理 191
8.3线路规程 194
8.4串口驱动程序与TTY 196
8.4.1串口设备驱动程序原理 196
8.4.2 S3C6410的串口驱动程序
实例 199
8.5 TTY应用层 202
第9章网络设备驱动程序 205
9.1 DM9000网卡驱动程序
开发 205
9.1.1 DM9000原理 205
9.1.2 DM9000X驱动程序分析 207
9.1.3 DM9000网口驱动程序移植 215
9.2 NFS根文件系统搭建 219
9.2.1主机配置 219
9.2.2 NFS根文件系统搭建实例 220
9.3 netlink Socket 224
9.3.1 netlink机制 224
9.3.2 netlink应用层编程 228
9.3.3 netlink驱动程序实例 229
第10章 framebuffer驱动程序 232
10.1 Linux framebuffer驱动
程序原理 232
10.1.1 framebuffer核心数据结构 232
10.1.2 framebuffer操作接口 234
10.1.3 framebuffer驱动程序的文件
接口 236
10.1.4 framebuffer驱动程序框架 236
10.2 S3C6410显示控制器 238
10.3 S3C6410 LCD驱动程序实例 243
10.4 framebuffer应用层 250
10.5 Qt4界面系统移植 251
第11章输入子系统驱动程序 253
11.1 Linux输入子系统概述 253
11.1.1 input_dev结构 253
11.1.2输入事件 255
11.2 input_handler 256
11.2.1 Input Handler层 256
11.2.2常用的Input Handler 259
11.3输入设备应用层 261
11.4键盘输入设备驱动程序
实例 262
11.5 event接口 267
11.6触摸屏驱动程序实例 270
11.6.1 S3C6410触摸屏控制器 270
11.6.2 S3C6410触摸屏驱动程序
设计 273
11.7触摸屏校准 282
11.7.1触摸屏校准原理 282
11.7.2利用TSLIB库校准触摸屏 282
第12章 USB驱动程序 284
12.1 USB体系概述 284
12.1.1 USB系统组成 284
12.1.2 USB主机 284
12.1.3 USB设备逻辑层次 285
12.2 Linux USB驱动程序体系 287
12.2.1 USB总体结构 287
12.2.2 USB设备驱动程序 287
12.2.3主机控制器驱动程序 288
12.2.4 USB请求块urb 289
12.2.5 USB请求块的填充 291
12.3 S3C6410 USB主机控制器
驱动程序 292
12.3.1 USB主机控制器驱动程序
分析 292
12.3.2 S3C6410 USB驱动程序
加载 294
12.4 USB键盘设备驱动程序
分析 296
12.5 USB Gadget驱动程序 301
12.5.1 Linux USB Gadget驱动程序 301
12.5.2 Linux USB Gadget驱动程序
实例 302
第13章音频设备驱动程序 303
13.1 ALSA音频体系 303
13.2 ALSA驱动层API 304
13.2.1声卡和设备管理 304
13.2.2 PCM API 304
13.2.3控制与混音API 305
13.2.4 AC97 API 306
13.2.5 SOC层驱动 307
13.3 ALSA驱动程序实例 308
13.3.1 S3C6410的AC97控制
单元 308
13.3.2 S3C6410声卡电路原理 309
13.3.3 S3C6410的数字音频接口 310
13.3.4 wm9713的数字音频接口 313
13.4 ALSA音频编程接口 316
13.4.1 ALSA PCM接口实例 316
13.4.2 ALSA MIDI接口实例 320
13.4.3 ALSA mixer接口实例 321
13.4.4 ALSA timer接口实例 322
第14章 video4linux2视频
驱动程序 327
14.1 video4linux2驱动程序
架构 327
14.1.1 video4linux2驱动程序的
注册 327
14.1.2 v4l2_fops接口 331
14.1.3常用的结构 332
14.1.4 video4linux2的ioctl函数 333
14.2 S3C6410摄像头驱动程序
分析 333
14.2.1电路原理 333
14.2.2驱动程序分析 334
14.3 video4linux2应用层实例 339
第15章 SD卡驱动程序 346
15.1 Linux SD卡驱动程序体系 346
15.1.1 SD卡电路原理 346
15.1.2 MMC卡驱动程序架构 347
15.1.3 MMC卡驱动程序相关
结构 347
15.1.4 MMC卡块设备驱动程序 350
15.1.5 SD卡主机控制器接口驱动
程序 356
15.2 S3C6410 SD卡控制器驱动
程序分析 360
15.2.1电路原理 360
15.2.2 S3C6410 SDHCI驱动
程序原理 360
15.2.3 SD卡的加载实例 364
参考文献 366
linux所有驱动都可以编译成模块吗
linux下编译运行驱动
嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发。
按照如下方法就可以成功编译出hello world模块驱动。
1、首先确定本机linux版本
怎么查看Linux的内核kernel版本?
'uname'是Linux/unix系统中用来查看系统信息的命令,适用于所有Linux发行版。配合使用'uname'参数可以查看当前服务器内核运行的各个状态。
#uname-a
Linux whh 3.5.0-19-generic#30-Ubuntu SMPTue Nov 13 17:49:53 UTC 2012 i686 i686 i686 GNU/Linux
只打印内核版本,以及主要和次要版本:
#uname-r
3.5.0-19-generic
要打印系统的体系架构类型,即的机器是32位还是64位,使用:
#uname-p
i686
/proc/version文件也包含系统内核信息:
# cat/proc/version
Linux version 3.5.0-19-generic(buildd@aatxe)(gcc version 4.7.2(Ubuntu/Linaro 4.7.2-2ubuntu1))#30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012
发现自己的机器linux版本是:3.5.0-19-generic
2、下载机器内核对应linux源码
到下面网站可以下载各个版本linux源码
如我的机器3.5.0版本源码下载地址为:
下载完后,找一个路径解压,如我解压到/linux-3.5/
然后很重要的一步是:执行命令uname-r,可以看到Ubuntu的版本信息是3.5.0-19-generic
。进入linux源码目录,编辑Makefile,将EXTRAVERSION=修改为EXTRAVERSION=-19-generic。
这些都是要配置源码的版本号与系统版本号,如果源码版本号和系统版本号不一致,在加载模块的时候会出现如下错误:insmod: error inserting'hello.ko':-1 Invalid module format。
原因很明确:编译时用的hello.ko的kenerl不是我的pc的kenerl版本。
执行命令cp/boot/config-3.5.0-19-generic./config,覆盖原有配置文件。
进入linux源码目录,执行make menuconfig配置内核,执行make编译内核。
3、写一个最简单的linux驱动代码hello.c
/*======================================================================
Asimple kernel module:"hello world"
======================================================================*/
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("zeroboundaryBSD/GPL");
static int hello_init(void)
{
printk(KERN_INFO"Hello World enter\n");
return0;
}
static void hello_exit(void)
{
printk(KERN_INFO"Hello World exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("zeroboundary");
MODULE_DESCRIPTION("A simple HelloWorld Module");
MODULE_ALIAS("a simplestmodule");
4、写一个Makefile对源码进行编译
KERN_DIR=/linux-3.5
all:
make-C$(KERN_DIR) M=`pwd` modules
clean:
make-C$(KERN_DIR) M=`pwd` clean
obj-m+= hello.o
5、模块加载卸载测试
insmod hello.ko
rmmod hello.ko
然后dmesg|tail就可以看见结果了
最后,再次编译驱动程序hello.c得到hello.ko。执行insmod./hello.ko,即可正确insert模块。
使用insmod hello.ko将该Module加入内核中。在这里需要注意的是要用 su命令切换到root用户,否则会显示如下的错误:insmod: error inserting'hello.ko':-1 Operation not permitted
内核模块版本信息的命令为modinfo hello.ko
通过lsmod命令可以查看驱动是否成功加载到内核中
通过insmod命令加载刚编译成功的time.ko模块后,似乎系统没有反应,也没看到打印信息。而事实上,内核模块的打印信息一般不会打印在终端上。驱动的打印都在内核日志中,我们可以使用dmesg命令查看内核日志信息。dmesg|tail
可能还会遇到这种问题insmod: error inserting'hello.ko':-1 Invalid module format
用dmesg|tail查看内核日志详细错误
disagrees about version of symbolmodule_layout,详细看这里。
在X86上我的办法是:
make-C/usr/src/linux-headers-3.5.0-19-generic SUBDIRS=$PWD modules
如何编写Linux下Nand Flash驱动
【Linux下nand flash驱动编写步骤简介】
1.了解硬件的nand
flash的各个参数和工作原理
具体参考nand flash的datasheet,主要包括,自己nand
flash的厂商,型号等。
Nand flash的页大小,oob大小,块大小,位宽8bit还是16bit。
工作原理,上面已经做了一定描述,不清楚的,可以参考datasheet,多看看,就会明白很多。
2.按照linux下驱动编写规范编写nand
flash驱动,
可以参考其他已经有的驱动,比如内核源码中已经有的
drivers/mtd/nand/s3c2410.c
就是个很好的例子。
自己以其为模板,实现自己板子的nand flash驱动。
其实主要工作就是,实现
static struct platform_driver s3c2410_nand_driver=
{
.probe=
s3c2410_nand_probe,
.remove=
s3c2410_nand_remove,
.suspend=
s3c24xx_nand_suspend,
.resume=
s3c24xx_nand_resume,
.driver={
.name=
"s3c2410-nand",
.owner=
THIS_MODULE,
},
};
中的
XXX_nand_probe函数
XXX_nand_remove函数
XXX_nand_enable_hwecc,如果支持硬件ecc的话。
对nand flash的读写,这两个函数,实现了对nand的具体操作。
【Linux下Nand Flash驱动编写简单步骤】
软件和硬件知识,都已经了解的话,由于上层的linux的 mtd框架中,已经完全封装好了,对nand
flash的write page,write oob等相关函数的实现,那么剩下的只是相对来说已经是很少量的,关于nand
驱动具体内部操作方面的工作:
1.初始化
先是在nand芯片初始化的时候,对其
XXX_nand_init_chip()
给对应的芯片chip赋给对应的
XXX_nand_read_buf和XXX_nand_write_buf等函数:
chip->cmd_ctrl=
XXX_nand_hwcontrol;
chip->dev_ready=
XXX_nand_devready;
chip->read_buf=
XXX_nand_read_buf;
chip->write_buf=
XXX_nand_write_buf;
以实现后续的对nand芯片的操作。
然后根据ecc类型,赋给对应的ecc的校验与纠错函数:
chip->ecc.hwctl=
XXX_nand_enable_hwecc;
chip->ecc.calculate= XXX
_nand_calculate_ecc;
3.
实现上面提到的对应的各个函数,关于如何实现,参考一下其他nand驱动,就会理解很多了。
4.驱动测试,参考具体的 ldd3(Linux
Device Driver version 3)的测试相关部分内容。
说得很乱,希望对大家有些帮助。