第1章 为什么学习本书? 1
1.1 本书读者对象 1
1.2 本书主要内容 2
1.3 学习方法 2
1.4 本书的组织结构 3
1.5 本书中的软件 4
1.6 结束语 5
第2章 Raspberry Pi 7
2.1 型号 7
2.2 共有的硬件 9
2.3 选择哪一种型号? 9
第3章 准备 11
3.1 静态IP地址 11
3.2 使用SSH 12
3.3 虚拟网络计算机 13
3.3.1 显示器编号 13
3.3.2 几何尺寸 13
3.3.3 深度 14
3.3.4 像素格式 14
3.3.5 密码设置 14
3.3.6 服务器的启动 14
3.3.7 VNC查看器 14
3.3.8 停止VNC服务器 15
3.4 原型站 15
3.5 Adafruit Pi Cobbler 16
3.6 Gertboard 17
3.7 裸机 17
第4章 电源 19
4.1 计算功率 19
4.2 电流需求 20
4.3 外围设备电源 20
4.4 B型输入电源 21
4.5 A型输入电源 22
4.6 3.3 V电源 22
4.7 供电的USB集线器 22
4.8 电源适配器 22
4.8.1 一款不合适的电源 23
4.8.2 电子书适配器 23
4.8.3 最好的电源 23
4.8.4 电压测试 24
4.9 蓄电池电源 25
4.9.1 要求 25
4.9.2 余量 25
4.9.3 LM7805调节 25
4.9.4 DC-DC降压变换器 26
4.10 供电不足的征兆 28
4.11 断电 28
第5章 头带、LED和复位 29
5.1 状态指示LED灯 29
5.1.1 OK或ACT LED 29
5.1.2 PWR LED 29
5.1.3 FDX LED 30
5.1.4 LNK LED 30
5.1.5 10M或10/100 LED 30
5.2 P1头 30
5.2.1 安全模式 32
5.2.2 逻辑电平 33
5.2.3 复位时GPIo的配置 33
5.2.4 单总线驱动器 33
5.3 P5头 33
5.4 复位 34
第6章 SDRAM 37
6.1 /proc/meminfo 37
6.1.1 MemTotal(总存储器) 39
6.1.2 MemFree(空闲存储器) 39
6.1.3 Buffers(缓冲区) 40
6.1.4 Cached(高速缓存的) 40
6.1.5 SwapCached(交换的缓冲区) 40
6.1.6 Active(活跃的存储器空间) 40
6.1.7 Inactive(不活跃的存储器空间) 40
6.1.8 Active(anon) 41
6.1.9 Inactive(anon) 41
6.1.10 Active(file) 41
6.1.11 Inactive(file) 41
6.1.12 Unevictable(不可回收的) 42
6.1.13 Mlocked(被锁定的) 42
6.1.14 SwapTotal(交换的总数) 42
6.1.15 SwapFree(自由交换的数量) 42
6.1.16 Dirty 42
6.1.17 Writeback 43
6.1.18 AnonPages 43
6.1.19 Mapped 43
6.1.20 Shmem 43
6.1.21 Slab 43
6.1.22 SReclaimable 44
6.1.23 SUnreclaim 44
6.1.24 KernelStack 44
6.1.25 PageTables 44
6.1.26 NFS_Unstable 44
6.1.27 Bounce 45
6.1.28 WritebackTmp 45
6.1.29 CommitLimit 45
6.1.30 Committed_AS 46
6.1.31 VmallocTotal 47
6.1.32 VmallocUsed 47
6.1.33 VmallocChunk 47
6.2 物理存储器 47
6.3 存储器映射 48
6.3.1 地址 50
6.3.2 长度 50
6.3.3 保护 50
6.3.4 标志 50
6.3.5 文件描述符 50
6.3.6 偏移 51
6.3.7 返回值 51
6.3.8 volatile关键字 51
6.4 虚拟存储器 52
6.5 关于SDRAM的最后一点看法 52
第7章 CPU 53
7.1 鉴别 53
7.2 超频 54
7.3 执行 56
7.4 线程 57
7.4.1 pthread头文件 57
7.4.2 pthread错误处理 57
7.4.3 pthread_create(3) 58
7.4.4 pthread_attr_t 59
7.4.5 pthread_join(3) 60
7.4.6 pthread_detach(3) 61
7.4.7 pthread_self(3) 62
7.4.8 pthread_kill(3) 62
7.5 mutex 63
7.5.1 pthread_mutex_create(3) 63
7.5.2 pthread_mutex_destroy(3) 63
7.5.3 pthread_mutex_lock(3) 64
7.5.4 pthread_mutex_unlock(3) 64
7.6 条件变量 65
7.6.1 pthread_cond_init(3) 66
7.6.2 pthread_cond_destroy(3) 67
7.6.3 pthread_cond_wait(3) 67
7.6.4 pthread_cond_signal(3) 68
7.6.5 pthread_cond_broadcast(3) 68
第8章 USB 69
8.1 电源 70
8.2 供电集线器 70
8.3 USB API支持 71
8.3.1 libusb 71
8.3.2 Include文件 71
第9章 以太网 75
9.1 有线以太网 75
9.1.1 /etc/network/interfaces 76
9.1.2 改变到静态IP 76
9.1.3 测试静态IP地址 77
9.1.4 USB适配器 78
9.1.5 /etc/hosts文件 78
9.2 无线以太网 78
第10章 SD卡存储 83
10.1 SD卡媒介 83
10.2 SD卡接口 83
10.3 SD卡基础 84
10.4 Raspbian区块尺寸 84
10.5 容量和性能 86
10.6 传送模式 86
10.6.1 SPI总线模式 86
10.6.2 1位SD模式 87
10.6.3 4位SD模式 88
10.7 耗损均衡 88
第11章 UART 91
11.1 RS-232转换器 91
11.2 RS-232 93
11.2.1 起始位 93
11.2.2 数据位 94
11.2.3 奇偶位 94
11.2.4 停止位 94
11.2.5 波特率 95
11.2.6 中断 96
11.2.7 流控制 96
11.3 Raspberry Pi UART 98
11.4 ARM PL011 UART 98
11.4.1 RTS/CTS访问 98
11.4.2 PL011 UART特性 99
11.5 独占串行线路的使用 100
11.5.1 步骤 100
11.5.2 验证 101
11.6 串行API 101
11.6.1 头文件 101
11.6.2 open(2) 101
11.6.3 结构体termios 102
11.6.4 tcgetattr(3) 104
11.6.5 tcsetattr(3) 105
11.6.6 tcsendbreak(3) 105
11.6.7 tcdrain(3) 106
11.6.8 tcflush(3) 106
11.6.9 tcflow(3) 107
11.6.10 cfmakeraw(3) 107
11.6.11 cfgetispeed(3) 110
11.6.12 cfgetospeed(3) 110
11.6.13 cfsetispeed(3) 111
11.6.14 cfsetospeed(3) 111
11.6.15 cfsetspeed(3) 111
11.6.16 read(2) 112
11.6.17 write(2) 113
11.6.18 readv(2)和writev(2) 114
11.6.19 EINTR错误 115
第12章 GPIO 117
12.1 引脚和名称 117
12.2 复位后的配置 118
12.3 上拉电阻 120
12.3.1 配置上拉电阻 120
12.3.2 测试上拉状态 124
12.4 逻辑电平 125
12.5 驱动能力 125
12.5.1 输入引脚 126
12.5.2 输出引脚 126
12.5.3 驱动LED 128
12.5.4 测试驱动能力 130
12.6 GPIO电流预算 132
12.7 配置 132
12.7.1 交替功能选择 132
12.7.2 输出引脚 133
12.7.3 输入引脚 133
12.7.4 交替功能 133
12.8 Sysfs GPIO访问 134
12.8.1 export 134
12.8.2 unexport 135
12.8.3 gpioX 135
12.8.4 芯片级 137
12.9 GPIO测试器 137
12.10 GPIO输入测试 138
12.11 可能的波动 140
12.12 读取事件 140
12.13 直接寄存器访问 145
12.13.1 gpio_init() 146
12.13.2 gpio_config() 146
12.13.3 gpio_write() 146
12.13.4 gpio_read() 147
12.13.5 gpio_io.c 147
12.14 GPIO晶体管驱动器 149
12.14.1 驱动器设计 149
12.14.2 替代品 151
12.14.3 电感负载 151
12.14.4 驱动器小结 152
12.15 GPIO实用程序 152
12.15.1 显示GPIO设置 153
12.15.2 读GPIO 154
12.15.3 写GPIO 154
12.15.4 修改驱动层 154
第13章 单总线驱动器 155
13.1 单总线与供电 155
13.2 线上供电 155
13.3 主机和从机 156
13.4 协议 156
13.4.1 复位 157
13.4.2 数据输入/输出 157
13.5 从机支持 158
13.6 读取温度 158
13.6.1 总线主机 160
13.6.2 从机设备 160
13.6.3 读取温度 162
13.7 单总线GPIO引脚 162
第14章 I2C总线 165
14.1 I2C概述 165
14.2 SDA和SCL 166
14.3 多主机和仲裁 166
14.4 总线信号传输 167
14.5 数据位 167
14.6 消息格式 168
14.7 哪些I2C总线? 169
14.8 I2C总线速度 169
14.9 工具 170
14.10 I2C API 170
14.10.1 内核模块支持 170
14.10.2 头文件 171
14.10.3 open(2) 171
14.10.4 ioctl(2,I2C_FUNC) 172
14.10.5 ioctl(2,I2C_RDWR) 172
第15章 SPI总线 175
15.1 SPI基础 175
15.2 SPI模式 176
15.3 信号传输 176
15.4 从机选择 177
15.5 驱动支持 178
15.6 SPI API 179
15.6.1 头文件 179
15.6.2 打开设备 180
15.6.3 SPI模式宏 180
15.6.4 字的每一位 181
15.6.5 时钟频率 182
15.6.6 数据输入/输出 182
15.6.7 关闭 185
15.6.8 写 185
15.6.9 读 185
15.7 SPI测试 185
第16章 引导 189
16.1 引导ARM LinuX 189
16.2 启动顺序 190
16.3 引导文件 190
16.4 config.txt 191
16.4.1 复合视频设置 191
16.4.2 高精度视频 192
16.4.3 过扫描视频 198
16.4.4 帧缓冲器设置 198
16.4.5 通用视频选项 199
16.4.6 授权的多媒体数字编解码器 200
16.4.7 测试 200
16.4.8 存储器 200
16.4.9 启动引导选项 201
16.4.10 超频 205
16.4.11 保单与超频 206
16.4.12 电压设置 210
16.5 cmdline.txt 212
16.5.1 Serial console= 213
16.5.2 Virtual console= 214
16.5.3 kgdboc= 214
16.5.4 root= 214
16.5.5 rootfstype= 215
16.5.6 elevator= 215
16.5.7 rootwait= 215
16.5.8 nfsroot= 216
16.5.9 ip= 217
16.6 应急内核 217
第17章 初始化 219
17.1 运行等级 219
17.2 /etc/inittab 220
17.2.1 inittab的行为initdefault 220
17.2.2 常规启动顺序 221
17.2.3 inittab的行为wait 223
17.2.4 inittab的行为once 223
17.2.5 inittab的行为respawn 224
17.3 改变运行等级 224
17.3.1 telinit 224
17.3.2 运行等级的修改 225
17.3.3 单用户模式 225
17.3.4 关机和重启 225
17.4 创建新的服务 225
第18章 vcgencmd 227
18.1 vcgencmd命令 227
18.2 选项measure_clock 228
18.3 选项measure_volts 229
18.4 选项measure_temp 230
18.5 选项codec_enabled 230
18.6 选项version 231
18.7 选项get_lcd_info 231
18.8 选项get_config 231
第19章 Linux控制台 233
19.1 可用的控制台 233
19.2 串行控制台 234
第20章 交叉编译 235
20.1 术语 235
20.2 操作系统 236
20.3 宿主、客户、本地和目标 236
20.3.1 平台的限制 237
20.3.2 没有VirtualBox(本机) 237
20.3.3 使用VirtualBox(Ubuntu/Linux) 237
20.4 规划你的交叉开发环境 237
20.5 构建交叉编译环境 238
20.5.1 下载crosstool-NG 238
20.5.2 暂存目录 239
20.5.3 解压源码文件(tarball) 239
20.5.4 创建/opt/x-tools目录 239
20.5.5 安装软件包依赖 239
20.5.6 配置crosstool-NG(源代码安装的第一步) 240
20.6 编译crosstool-ng 240
20.7 将程序安装至系统中 240
20.8 路径 240
20.9 交叉编译配置 241
20.9.1 路径和其他选项 241
20.9.2 目标选项 243
20.9.3 操作系统 243
20.9.4 二进制实用程序 244
20.9.5 C语言编译器 244
20.9.6 保存配置 245
20.10 构建交叉编译器 246
第21章 交叉编译内核 249
21.1 镜像工具 249
21.2 下载内核 250
21.3 编辑Makefile 251
21.4 make mrproper指令 252
21.5 内核配置 252
21.6 make menuconfig指令(图形化的内核配置) 253
21.7 make指令 253
21.8 准备内核镜像 253
21.9 安装内核镜像 254
21.10 模块 255
21.11 固件 256
21.12 SD卡VirtualBox(虚拟机)的安装 257
第22章 DHT11传感器 259
22.1 特征 259
22.2 电路 260
22.3 协议 260
22.3.1 通用协议 260
22.3.2 数据位数 261
22.3.3 数据格式 261
22.3.4 软件 262
22.3.5 选择的方法 263
22.4 运行示例 264
22.5 源代码 265
第23章 MCP23017 GPIO扩展器 271
23.1 DC特征 271
23.1.1 GPIO输出电流 272
23 1.2 GPIO输入 272
23.1.3 待机电流 273
23.1.4 输入逻辑电平 273
23.1.5 输出逻辑电平 273
23.2 复位时序 274
23.3 电路 274
23.4 I2C总线 275
23.5 接线和测试 275
23.6 软件配置 277
23.7 主程序 283
23.8 i2c_funcs.c模块 288
23.9 sysgpio.c模块 291
23.10 运行示例 294
23.11 响应时间 296
第24章 Nunchuk手柄 299
24.1 项目概况 299
24.2 Nunchuk手柄的特点 299
24.3 连接器引脚输出 300
24.4 测试连接 301
24.5 NunchukI2C协议 302
24.5.1 加密 302
24.5.2 读取传感器的数据 302
24.6 Linux uinput界面 303
24.6.1 使用头文件 304
24.6.2 打开设备节点 304
24.6.3 配置事件 304
24.6.4 创建节点 308
24.6.5 发布EV_KEY事件 309
24.6.6 发布EV_REL事件 310
24.6.7 发布EV_SYN事件 310
24.6.8 关闭uinput 311
24.7 X-Windows(图形用户界面) 311
24.8 输入实用程序 312
24.9 测试Nunchuk 312
24.9.1 测试./Nunchuk 313
24.9.2 Lsinput实用程序 314
24.9.3 input-events实用程序 314
24.10 程序 315
第25章 实时时钟 325
25.1 DS1307概述 325
25.1.1 X1和X2引脚 326
25.1.2 SQW/OUT引脚 326
25.2 电源 327
25.3 3伏特兼容性 328
25.4 微小的RTC修改 328
25.5 DS1307总线速度 331
25.6 RTC和RAM地址映射 331
25.7 阅读日期和时间 332
25.8 I2C通信 333
25.9 接线 334
25.10 运行示例 334
25.11 最终测试 335
25.12 启动脚本 335
第26章 VS1838B红外接收器 345
26.1 操作参数 345
26.2 VS1838B电路 346
26.3 软件 347
26.3.1 信号元件 348
26.3.2 组织机构代码 349
26.3.3 命令行选项 349
第27章 步进电机 363
27.1 软盘步进电机 363
27.2 驱动器电路 365
27.3 驱动驱动器 368
27.3.1 输入电平 368
27.3.2 复位/启动电源 369
27.4 操作模式 370
27.4.1 波驱动(0模式) 370
27.4.2 全步进驱动(1模式) 370
27.4.3 半步进驱动(2模式) 370
27.5 软件 371
第28章 H桥驱动器 381
28.1 L298驱动器 381
28.1.1 传感电阻 382
28.1.2 使能A和B 382
28.1.3 In1和In2输入 382
28.1.4 保护二极管 382
28.2 L298 PCB 383
28.3 从GPIO驱动 384
28.4 双极步进模式 386
28.4.1 单相波模式 386
28.4.2 双相波模式 386
28.4.3 半步模式 387
28.5 选择驱动GPIO 388
28.6 项目示意图 388
28.7 程序运行 389
第29章 远程控制面板 399
29.1 切换输入 399
29.2 CD4013 400
29.3 触发器测试 401
29.4 LED灯 402
29.5 ?MQ 402
29.5.1 执行安装 402
29.5.2 编译和链接 403
29.6 感测站的设计 403
29.7 感测站程序 404
29.8 控制台程序 404
29.9 传感器源代码 405
29.1 0控制台源代码 413
第30章 脉冲宽度调制 419
30.1 PWM介绍 419
30.2 PWM参数 420
30.3 PWM硬件外设 420
30.4 PWM软件 420
30.5 仪表电路 420
30.6 pwm程序 421
30.6.1 PWM硬件设置命令 423
30.6.2 基于硬件显示CPU使用百分比(率) 424
30.6.3 PWM程序软件 430
30.6.4 有多少PWM? 432
30.6.5 运行PWM软件命令 433
30.6.6 基于软件显示CPU使用百分比 433
附录A 术语表 437
附录B 电源标准 443
附录C 电子学参考 445
附录D Raspbjan apt命令 447
附录E ARM编译选项 451
附录F Mac OS X技巧 453
参考文献 455