码迷,mamicode.com
首页 > 其他好文 > 详细

note

时间:2018-04-24 00:14:47      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:lap   嵌入式   sizeof   作用   单片机   devices   read   sys   tags   

技术分享图片
  1 周末班上课笔记
  2 1.从redhat centos过度到ubuntu
  3 a)修改网络配置
  4 b)ubuntu安装
  5 建议在安装ubuntu的过程中断网
  6 分区:
  7 建议分3个区
  8 1.home分区   100G----->/home
  9 2.交换分区   8G
 10 3.根分区     30G------>/
 11 c)软件管理
 12 centos redhat --->yum rpm
 13 ubuntu----------->apt dpkg
 14 d)用户
 15 建议:在ubuntu下建议不要使用root
 16 如果想要root权限,只需要在执行命令的时候加sudo
 17 sudo apt-get install minicom
 18 e)新装的ubuntu系统需要更新系统
 19 sudo apt-get update
 20 f)新装的ubuntu系统需要安装的软件包
 21 www.embsky.com
 22 在站内搜索:ubuntu----><新装ubuntu系统需要安装的包>
 23 g)unity gnome2 gnome3
 24 sudo apt-get install gnome
 25 
 26 2.嵌入式系统分类
 27 无操作系统
 28 单片机
 29 带操作系统
 30 单片机--->ucos
 31 SOC------>linux/Android/win
 32 
 33 3.arm历史
 34 官网:www.arm.com
 35 arm公司不做芯片,只设计处理器架构
 36 arm1 arm2 arm3 ..... arm6
 37 半导体公司:ST TI 三星 NXP 高通 ADI
 38 华为 小米 联发科 全志 龙芯 ..........
 39 cpu          SOC = cpu+控制器+总线
 40 经典处理器:
 41 arm7--------->S3C44B0
 42 arm9--------->S3C2410/S3C2440
 43 arm11-------->S3C6410 
 44 
 45 cortex系列处理器:
 46 arm-cortex-a
 47 application
 48 a8        S5PV210 单核  三星 
 49 Am335   单核  TI
 50 a9
 51 Exynos4412 4核
 52 Omap4460   2核
 53 Imax6Q       4核
 54 Imax6D       2核
 55 S5P4418    4核
 56 a15
 57 Exynos5210    
 58 a53    
 59 64位    
 60 S5P6818    8核
 61 a72
 62 64位
 63 arm-cortex-m
 64 mcu
 65 m3        stm32f103
 66 m4        stm32f407
 67 arm-cortex-r
 68 realtime 
 69 r4/r6
 70 
 71 4)开发板sdk下载    
 72 a)从教师及ftp下载
 73 b)从www.embsky.com下载
 74 c)解压sdk
 75 tar -xvf s5p6818sdk_lzy1.tar.bz2 -C /var/ftp/embsky/source/zmb/      
 76 
 77 5)嵌入式软件架构
 78 
 79 app
 80 游戏 软件 桌面 .....
 81 文件系统 buildroot
 82 文件管理    
 83 kernel  linux/Android
 84 进程管理 内存管理 文件系统 网络设备 设备驱动
 85 bootloader uboot        
 86 初始化硬件 引导内核
 87 -----------------------------------------------------
 88 arm---->SOC+lcd+soud+net+ts+sensor......
 89 mips
 90 ppc
 91 
 92 6)开发方式
 93 第一手开发---->原厂
 94 第二手开发---->做开发板
 95 第三手开发---->项目
 96 
 97 7)Android系统和Linux系统
 98 Android:
 99 emmc{bootloader uImage ramdisk [system][data][cache][storage]}
100 bootloader--->uImage--->ramdisk /
101 /system  挂载system分区
102 /data    挂载data分区
103 /cache   挂载cache分区
104 /storage 挂载storage分区
105 Linux:
106 emmc{bootloader uImage [rootfs]}
107 
108 8)搭建嵌入式开发环境之刷Linux系统
109 a)制作刷机sd卡          /dev/sdb2
110 sd{  80M(uboot)  [   ]  [  ]}
111 /dev/sdb       /dev/sdb1
112 bootloader 513字节
113 芯片要求 
114 S5P6818--->rom---->513
115 <详细内容请查看视频>
116 
117 b)把uboot烧写到sd卡
118 sudo dd if=ubootpak.bin of=/dev/sdb seek=1
119 sync
120 
121 c)配置minicom
122 作用:能够操作PC的串口
123 115200 8N1
124 
125 d)刷机 Linux
126 emmc{ubootpak.bin [boot.img][rootfs.ext2][][][][][]}
127 /dev/mmcblk0
128 /dev/mmcblk0p1
129 /dev/mmcblk0p2
130 bootloader--->uImage---->rootfs
131 
132 e)修改uboot环境变量
133 倒数3秒
134 [zyli@Uboot]# set bootcmd "ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000"
135 [zyli@Uboot]# set bootargs root=/dev/mmcblk0p2 tp=gslx680-linux
136 [zyli@Uboot]# save
137 拔出sd卡
138 f)重启开发板
139 [zyli@Uboot]# reset
140 相关内容请查看:<minicom配置.mp4>  <刷机(linux).mp4>  <制作sd卡分区.mp4>
141 
142 soc+ddr(1G)+emmc(8)
143     socs5p6818支持3中启动方式:.sd卡 .emmc .usb
144     sd卡中的bootloader运行:bootloader提供一个命令fastboot
145 
146     9)搭建嵌入式开发环境之刷Android系统
147     相关内容请查看:<刷机Android.mp4>
148 
149 10)编译嵌入式系统ROM(Linux)
150     a)bootloader
151     相关内容请查看:<编译uboot.mp4>
152     b)kernel
153     tar -xvf linux-3.4.tar.bz2
154     cd kernel
155     vim Makefile
156     CROSS_COMPILE=
157     make x6818_defconfig
158     make menuconfig
159     make -j4                
160     make uImage
161 
162     编译完成的内核在<linux_src>/arch/arm/boot/uImage
163     接下来要把uImage打包到boot.img中
164     tar -xvf boot.tar.bz2
165     cp ../src/kernel/arch/arm/boot/uImage boot/
166     ./make_ext4fs -s -l 64M -L linux boot.img ./boot
167 
168     c)rootfs
169     /
170     [------------------[/bin /sbin /usr/bin /usr/sbin /etc /dev /var ..../root /home/xxx]]        
171     busybox工具集
172     mplayer
173     mpg123
174     qt库
175     sqlite
176     mysql
177     python    
178 
179     buildroot 工具
180     ----->rootfs
181 
182     tar -xvf buildroot.tar.bz2
183     cd buildroot
184     make x6818_defconfig
185     make -j4
186 
187     编译过程中ncruse出错
188     vim output/build/host-ncurses-5.9/include/curses.tail
189     删掉/* generate */
190     make -j4
191 
192     11)bootloader  kernel rootfs运行方式
193     刷机: bootloader kernel rootfs----->都在emmc
194 
195     开发:
196     booloader--->sd卡
197     kernel------>在PC,由bootloader通过网络下载到板子的内存
198     rootfs------>在PC,板子的内核启动后通过nfs挂在根文件系统
199 
200     总结:
201     1.理论基础:嵌入式 物联网 Android/Linux arm/SOC
202     2.刷机:Linux/Android
203     原因:产品
204     3.下载内核:tftp
205     原因:开发阶段不希望重复刷机
206     4.网络文件系统:nfs
207     原因:方便开发板和PC之间的文件共享
208 
209     12)配置tftp    
210     保证:1.sd卡中有bootloader
211     2.开发板和电脑链接:串口线  网线
212     3.启动minicom
213     4.启动开发板,在minicom中显示uboot的终端
214     配置方法参考<www.embsky.com>
215 
216     13)nfs 网络文件
217     开发板的根是PC的一个目录,在开发内核驱动和应用程序的时候非常方便
218 
219 
220     14)arm架构和arm汇编
221     arm 先进的精简指令集(RISC)处理器
222     x86 51  CISC
223 
224     SOC=arm+总线+控制器+...
225 
226     参考/home/zyli/6818/s5p6818sdk_lzy1/extern/ARM架构手册.pdf P42
227     经典处理器有七种工作模式
228     1.用户模式  user    10000 执行用户态进程
229     2.系统模式  system          Linux系统不用
230     3.管理模式  svc        10011 uboot/Linux内核
231     4.中断模式  irq        10010 处理中断
232 5.快速中断  irq              处理快速中断(默认Linux不启动)
233     6.中止模式  abt              处理内存非法访问
234     7.未定义    unde          处理未定义指令
235 
236     8.虚拟化模式
237     9.安全模式
238 
239     模式1是普通模式
240     模式2-模式7是特权模式
241     模式3-模式7是异常模式
242 
243     有个寄存器CPSR[4:0]用来决定和表示当前的模式
244     只有特权模式才能写CPSR[4:0]
245 
246     系统调用  open
247     软件:用户态<--->内核态
248     硬件:user模式<--->管理模式
249     |
250     软中断 swi/svc
251     arm平台的所有系统调用都是基于swi/svc指令的
252 
253     重启/开机        reset异常 -----> 管理模式    
254     触摸屏/TIMER     中断异常  -----> 中断(快速中断)模式
255     未定义指令       未定义异常 ----> 未定义模式
256     访问非法内存    中止异常  -----> 中止模式
257     执行进程        进程调度  -----> 用户模式
258 
259 
260     ARM=Arm_Core+TCM+Cache+协处理器+        MMU + .........
261     |          |   |      |-协助处理器    |-虚拟地址到物理地址的转换
262     |          |   |      |-CP15 CP14 CP11 CP10
263 |          |   |-控制器(把数据缓存到cache或者刷cache)
264     |          |   |-I-cache D-cache
265     |          |-内存  
266     |-执行代码
267     |-寄存器r0,r1,...,r15    
268 
269 
270     架构:
271     冯诺依曼架构 arm7 8086
272     指令和数据不分离
273     哈佛架构 arm9 ..... 
274     指令和数据分开存储
275     流水线:
276     取指    把指令从内存取到cpu
277     译码    翻译执行
278     执行    执行指令
279 
280     7-------------
281     6-------------
282     5-------------
283     4-------------
284     3-------------  取指
285     2-------------  取指 译码
286     1-------------  取指 译码 执行
287 
288     寄存器:R0-r15
289     R0-r12
290 
291     R13  SP stack pointer         栈
292     R14  LR    link register         函数返回地址
293     R15  PC process counter        正在被取指的指令
294     PC指向正在被取指的指令的下下条指令
295 
296     15)arm汇编
297     arm指令集        32位
298     thumb指令集        16位
299     thumb2指令集        16/32位
300 
301     arm-cortex-m     thumb2
302     arm-cortex-a     arm
303 
304     <参考arm汇编常用指令.pdf>
305 
306     16)安装交叉编译器
307     [extern]$ tar -xvf arm-linux-gcc-4.5.1.tar.bz2
308     [bin]$ vim ~/.bashrc     
309     最后一行添加如下:
310     PATH=/home/zyli/6818/s5p6818sdk_lzy1/extern/4.5.1/bin:$PATH
311     [bin]$ source ~/.bashrc
312 
313     17)arm汇编指令
314     mov 寄存器,寄存器/立即数
315     mov r0, r1  //r0=r1
316     mov r0, #20 //r0=20        
317 
318     add 寄存器1,寄存器2,寄存器3/立即数
319     寄存器1=寄存器2+寄存器3/立即数
320     sub 寄存器1,寄存器2,寄存器3/立即数
321     寄存器1=寄存器2-寄存器3/立即数    
322     mul 寄存器1,寄存器2,寄存器3
323     寄存器1=寄存器2*寄存器3
324     div 寄存器1, 寄存器2, 寄存器3
325     寄存器1=寄存器2/寄存器3
326     adc 寄存器1,寄存器2,寄存器3/立即数
327 寄存器1=寄存器2+寄存器3/立即数+CPSR_C(进位)
328     sbc 寄存器1,寄存器2,寄存器3/立即数
329 寄存器1=寄存器2-寄存器3/立即数-!CPSR_C(借位)
330 
331     伪指令: ldr 寄存器,=数字   
332     寄存器=数字
333 
334 
335 
336     注意:表脚指令不需要+s就能影响CPSR的标志位
337     cmp 寄存器,寄存器1/立即数 寄存器-寄存器1/立即数---->CPSR_NZ
338     条件执行: eq ne lt gt ge le
339 
340     teq 寄存器,寄存器1/立即数    
341     寄存器^寄存器1/立即数
342 
343     位  & | ^ ~
344     and 寄存器,寄存器1,寄存器/立即数
345     寄存器=寄存器1 & 寄存器/立即数
346     orr 寄存器,寄存器1,寄存器/立即数
347     寄存器=寄存器1 | 寄存器/立即数
348     eor 寄存器,寄存器1,寄存器/立即数
349     寄存器=寄存器1 ^ 寄存器/立即数
350     mvn 寄存器,寄存器/立即数
351     寄存器=~寄存器/立即数
352 
353     >> <<
354     mov 寄存器, 寄存器1, lsl 寄存器2/立即数 
355     寄存器 = 寄存器1 << 寄存器2/立即数
356     去掉高位,低位补0
357     mov 寄存器, 寄存器1, lsr 寄存器2/立即数 
358     寄存器 = 寄存器1 >>> 寄存器2/立即数
359     去掉低位,高位补0
360     mov 寄存器, 寄存器1, asr 寄存器2/立即数 
361     寄存器 = 寄存器1 >> 寄存器2/立即数
362     去掉低位,高位补符号位
363     mov 寄存器, 寄存器1, ror 寄存器2/立即数 
364     寄存器 = 寄存器1 <<>> 寄存器2/立即数
365     去掉低位,补到高位
366 
367     bic 寄存器1,寄存器2,寄存器3/立即数
368     寄存器1 = 寄存器2 & ~寄存器3/立即数    
369 
370     练习:
371     //ledcon = ledcon | (1 << 3)
372     ledcon |= 1 << 3
373     伪码:
374     mov r0, #1
375     //orr %0, %0, r0, lsl #3
376     orr %0, r0, lsl #3
377 
378 ledcon &= ~(1 << 3)
379     伪码:
380     mov r0, #1
381     mvn r1, r0, lsl #3
382     and %0, r1
383 
384     bic %0, %0, #(1 << 3)
385 %0=%0&~(1 << 3)
386 
387 
388     swi/svc
389     系统调用
390     char *s = "helloworld\n";
391     write(1, s, strlen(s));
392 
393     write的实现:
394     syscall(4, 1, s, strlen(s));
395     syscall的实现:
396     mov r0, #1
397     mov r1, %0
398     mov r2, #11
399     mov r7, #4
400     swi 100---------->进入内核,内核获取r7的值,根据r7的值在系统调用表中找到对应的系统调用    
401 
402 
403     ldr 把数据从内存加载到寄存器
404     str 把数据从寄存器放到内存
405 
406 
407     ldr 寄存器,地址    寄存器=*地址
408     str 寄存器,地址       *地址=寄存器
409 
410 mov 寄存器, 寄存器/立即数(地址)
411     ldr 寄存器1, [寄存器]   寄存器1=*寄存器
412     str 寄存器1, [寄存器]   *寄存器=寄存器1
413 
414 ldr 寄存器1, [寄存器, #4]  寄存器1=*(寄存器+4)
415     ldr 寄存器1, [寄存器, #4]! 寄存器+=4 寄存器1=*寄存器
416 
417     ldr 寄存器1, [寄存器], #4  寄存器1=*寄存器  寄存器+=4
418     str 寄存器1, [寄存器], #4  *寄存器=寄存器1  寄存器+=4
419 
420 
421     b  标号(地址)
422 bl 标号(地址) 在跳转之前会把下一条指令的地址存放到LR(R14)
423     bx 寄存器
424 
425 汇编综合练习(代码分析)
426     1.函数调用
427     2.a++ + ++a + a++ + ++a .....
428 
429     总结:
430     .嵌入式基础
431     .刷机(产品发布)
432     .tftp(下载内核) nfs(挂在网络文件系统) (开发)
433     .arm架构  arm汇编  (了解)
434 
435 18)SOC裸板开发(不基于操作系统)
436     目的:熟悉板子
437     GPIO 通用的输入输出口
438     管脚----------输入 输出 其他
439     输出:控制   SOC---------LED--R--VCC
440     输入:检测   SOC---------Sensor
441     其他:串口等 SOC--------->
442 
443 推挽输出(能高能低)
444 
445     S5P6818一共有160个管脚为GPIO 分为5组 每组32个
446     SOC:Arm--->GPIO控制器(每一组io一个控制器)----->IO管脚
447     |-寄存器(地址) SFR
448 
449     具体寄存器参考S5P6816的datasheet
450     GPIOXOUT[31:0]
451 控制管脚电平的高低(输出)
452 
453     GPIOXOUTENB[31:0]
454     决定GPIO功能
455 
456     GPIOXPAD[31:0]
457 检测管脚状态(输入)
458 
459     GPIOx_PULLSEL[31:0]
460     选择上拉或者下拉电阻    
461 
462     GPIOx_PULLSEL_DISABLE_DEFAULT[31:0]
463     上拉电阻和下拉电阻的默认选择
464 
465     GPIOx_PULLENB[31:0]
466     选择是否需要上拉或者下拉电阻
467 
468     GPIOx_PULLENB_DISABLE_DEFAULT[31:0]
469     上拉/下拉电阻的使能/禁止的默认选择        
470 
471     .
472     ├── inc
473     │   ├── common.h
474     │   ├── hw.h
475     │   └── lib.h
476     ├── Makefile
477     ├── ReadMe.txt
478     └── src
479     ├── hw.c
480     ├── lib.c
481     ├── main.c
482     ├── Makefile
483     └── start.s                
484 
485     arm-linux-gcc main.c -c -o main.o -I ../inc
486     arm-linux-gcc hw.c -c -o hw.o -I ../inc
487     arm-linux-gcc lib.c -c -o lib.o -I ../inc
488     arm-linux-as start.s -o start.o
489     arm-linux-ld start.o main.o lib.o hw.o -o arm -Ttext 0x50000000
490     arm-linux-objcopy -O binary arm arm.bin
491 
492     借用Uboot的printf
493     调用函数:1.通过名字调用
494 2.通过函数指针(地址)
495 
496     Uboot在内存的0x43c00000运行:在Uboot的System.map文件中能够看到Uboot中多有函数的地址
497 
498     printf--->标准输出---->终端
499     开发板的终端设备是串口
500 
501     UART
502     S5P6818 的串口是3.3v
503 
504     ttl/232/485        
505     ttl:3.3V/5V------->1
506     0V------------>0
507     232: -3v -12v----->1
508     3v   12v----->0
509     485: 模拟 差分信号
510 
511 
512     ttl/232
513     ---->>>>------------------------------
514     ----<<<<------------------------------
515 
516     485/usb/eth
517     ----->>>>>--------------------------------
518     ----->>>>>--------------------------------
519 
520     ttl<--max232-->232
521     ttl<--max485-->485
522 
523     115200     8N1    
524 
525     串口配置流程:
526     1.GPIO其他功能
527     2.数据格式8N1
528     3.关闭FIFO
529     [UTXH]  FIFO--------------------------->
530     [URXH]  FIFO<---------------------------
531     4.关掉AFC
532     5.波特率115200
533 
534     6.发送数据
535     7.接收数据
536 
537     19)Linux内核驱动
538     查看Linux内核
539     ctags
540     1.解压内核源码
541     tar -xvf linux-3.4.tar.bz2
542     2.进入内核
543     cd kernel
544     3.创建索引
545     ctags -R .
546 
547     查看:
548     vim -t memcpy
549     :cstag memcpy
550     ctrl+]
551     ctrl+o
552 
553     在内核中添加自己的代码
554     cd kernel-3.4
555     mkdir drivers/zmb
556     touch drivers/zmb/test.c
557     touch drivers/zmb/Makefile
558     vim drivers/Makefile
559     obj-y += zmb/
560     vim drivers/zmb/Makefile
561     obj-y += test.o
562     vim drivers/zmb/test.c
563     内容参考具体文件
564     make
565     make uImage
566 
567     接下来启动内核,在启动过程中观察我们自己的代码启动
568 
569     在内核中添加自己的配置选项
570 make menuconfig ------> 提供一个配置界面(用来做内核裁剪)
571     例子1:通过make menconfig来配置test.c是否要编译到内核
572     touch drivers/zmb/Kconfig
573     vim drviers/zmb/Kconfig
574     config MY_TEST
575     bool "My Test Support"
576     default n
577     help
578     If you select this you will be happy
579     vim drivers/Kconfig
580     source "drivers/zmb/Kconfig"
581 
582     插曲:
583 ##################################################################
584 ###Kconfig--->make menuconfig--->[*]/[]----->.config           ###
585 ###                   |  |-CONFIG_MY_TEST=n           ###
586 ###                   |-CONFIG_MY_TEST=y              ###
587 ###--->make-->include/generated/autoconf.h  --->提供给C文件使用###
588 ###        |-#define CONFIG_MY_TEST 1                     ###
589 ###    -->include/config/auto.conf -------->提供给Makefile使用###
590 ###        |-CONFIG_MY_TEST=y                             ###
591 ##################################################################
592 
593     vim drivers/zmb/Makefile
594     obj-$(CONFIG_MY_TEST) += test.o        
595     make 
596     make uImage
597 
598     接下来启动内核,在启动过程中观察我们自己的代码启动
599 
600     例子2:能够控制条件编译的选项
601     touch drivers/zmb/test1.c
602     参考具体文件
603     vim drivers/zmb/Makefile
604     obj-$(CONFIG_MY_TEST1) += test1.o    
605     vim drivers/zmb/Kconfig
606     config MY_TEST1
607     bool "MY TEST1 Support"
608     default n
609     help
610     If you ........
611 
612     config FUN_ENABLE
613     bool "FUN_ENABLE Support"
614     depends on MY_TEST1
615     default n
616     help
617     If you ......
618     make menuconfig
619     make
620     make uImage
621 
622     接下来启动内核,在启动过程中观察我们自己的代码启动
623     注意:如果printk的消息级别不够的化,printk打印的东西会放到缓存而不会显示到终端
624     注意:查看缓存的命令dmesg
625 
626     例子3:目录型选项
627     cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak
628     vim drivers/zmb/Kconfig
629     在开头加menu "xxxxxxx"
630     在结尾加endmenu        
631 
632     例子4:能够控制的目录型选项
633     cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak1
634     vim drivers/zmb/Kconfig
635     参考具体文件
636     vim drivers/Makefile
637     obj-$(CONFIG_ZMB_TEST)          += zmb/
638 
639     例子5:
640     vim drivers/zmb/test1.c
641     在test_init函数中添加:
642     for (i = 0; i < CONFIG_PRINTK_COUNT; i++)
643     printk("%s\n", CONFIG_PRINTK_CONTENT);    
644     vim drivers/zmb/Kconfig
645     if MY_TEST1
646     config PRINTK_COUNT
647     int "printk count"
648     default 5
649     range 0 100
650     help
651     If .....
652     config PRINTK_CONTENT
653     string "printk content"
654     default "I am Kernel"
655     help
656     If .....
657     endif    
658 
659     例子6:多选一
660     vim drivers/zmb/Kconfig
661     choice
662     prompt "select you ts type"
663     config MY_TS1
664     bool "my ts1"
665     config MY_TS2
666     bool "my ts2"
667     config MY_TS3
668     bool "my ts3"
669     endchoice
670 
671     要求:根据选择的不同代码在启动的时候要打印不同的信息    
672 
673     代码参考<code>/kernel/01code_in_kernel
674 
675     总结:把代码编译到内核 有点:方便 缺点:修改代码后要重新编译内核和升级内核
676 
677     内核模块
678     可以把内核代码写成模块
679     模块可以在内核启动之后动态安装或者卸载
680     注意:1.编译内核模块需要用到编译通过的内核源码
681     2.在板子中运行的内核和编译模块的内核必须由同一套内核来编译
682 
683     insmod 内核模块.ko
684     rmmod  内核模块.ko
685     lsmod  用来查看当前内核中的模块
686 
687     代码参考<code>/kernel/02module
688 
689     字符设备
690     代码参考<code>/kernel/03cdev    
691 
692 
693     app:系统调用 open close ioctl read write select poll ....
694     /dev/led  /dev/wdt
695     ------------------------------------------------------
696     kernel:
697     led_driver wdt_driver ......
698     ------------------------------------------------------
699     SOC:寄存器 
700     led  wdt  uart  lcd  ts  net  wifi  iic  spi  eeprom ....
701 
702     字符设备------>lcd led ts uart wdt adc eeprom ......
703     块设备-------->sd卡 硬盘 emmc nand ......
704     网络设备------>网卡
705 
706     复习:fd = open("/dev/led", O_RDWR)
707     struct data_st {
708         int no
709             int on;
710     }led;    
711 led.no = 1;
712 led.on = 1;
713 write(fd, &led, sizeof(led));
714 
715 字符设备
716 设备号:主设备号+次设备
717 cat /proc/devices
718 
719 open close read write ioctl
720 
721 /dev/mydevice /dev/myhehe
722 |-15:1    |-15:2
723 --------------------------------------------------    
724 kernel
725 <--->cdev<-->cdev<--->cdev<--->cdev<--->
726 |-dev设备号15:1
727 |-count数量 3
728 |-ops--->file_operations
729 .open----------------->my_open
730 .release-------------->my_release
731 .write---------------->my_write
732 .read----------------->my_read
733 .unlocked_ioctl------->my_ioctl
734 ---------------------------------------
735 hardware
736 
737 struct cdev    
738 
739 20)项目
View Code
  1 周末班上课笔记
  2 1.从redhat centos过度到ubuntu
  3 a)修改网络配置
  4 b)ubuntu安装
  5 建议在安装ubuntu的过程中断网
  6 分区:
  7 建议分3个区
  8 1.home分区   100G----->/home
  9 2.交换分区   8G
 10 3.根分区     30G------>/
 11 c)软件管理
 12 centos redhat --->yum rpm
 13 ubuntu----------->apt dpkg
 14 d)用户
 15 建议:在ubuntu下建议不要使用root
 16 如果想要root权限,只需要在执行命令的时候加sudo
 17 sudo apt-get install minicom
 18 e)新装的ubuntu系统需要更新系统
 19 sudo apt-get update
 20 f)新装的ubuntu系统需要安装的软件包
 21 www.embsky.com
 22 在站内搜索:ubuntu----><新装ubuntu系统需要安装的包>
 23 g)unity gnome2 gnome3
 24 sudo apt-get install gnome
 25 
 26 2.嵌入式系统分类
 27 无操作系统
 28 单片机
 29 带操作系统
 30 单片机--->ucos
 31 SOC------>linux/Android/win
 32 
 33 3.arm历史
 34 官网:www.arm.com
 35 arm公司不做芯片,只设计处理器架构
 36 arm1 arm2 arm3 ..... arm6
 37 半导体公司:ST TI 三星 NXP 高通 ADI
 38 华为 小米 联发科 全志 龙芯 ..........
 39 cpu          SOC = cpu+控制器+总线
 40 经典处理器:
 41 arm7--------->S3C44B0
 42 arm9--------->S3C2410/S3C2440
 43 arm11-------->S3C6410 
 44 
 45 cortex系列处理器:
 46 arm-cortex-a
 47 application
 48 a8        S5PV210 单核  三星 
 49 Am335   单核  TI
 50 a9
 51 Exynos4412 4核
 52 Omap4460   2核
 53 Imax6Q       4核
 54 Imax6D       2核
 55 S5P4418    4核
 56 a15
 57 Exynos5210    
 58 a53    
 59 64位    
 60 S5P6818    8核
 61 a72
 62 64位
 63 arm-cortex-m
 64 mcu
 65 m3        stm32f103
 66 m4        stm32f407
 67 arm-cortex-r
 68 realtime 
 69 r4/r6
 70 
 71 4)开发板sdk下载    
 72 a)从教师及ftp下载
 73 b)从www.embsky.com下载
 74 c)解压sdk
 75 tar -xvf s5p6818sdk_lzy1.tar.bz2 -C /var/ftp/embsky/source/zmb/      
 76 
 77 5)嵌入式软件架构
 78 
 79 app
 80 游戏 软件 桌面 .....
 81 文件系统 buildroot
 82 文件管理    
 83 kernel  linux/Android
 84 进程管理 内存管理 文件系统 网络设备 设备驱动
 85 bootloader uboot        
 86 初始化硬件 引导内核
 87 -----------------------------------------------------
 88 arm---->SOC+lcd+soud+net+ts+sensor......
 89 mips
 90 ppc
 91 
 92 6)开发方式
 93 第一手开发---->原厂
 94 第二手开发---->做开发板
 95 第三手开发---->项目
 96 
 97 7)Android系统和Linux系统
 98 Android:
 99 emmc{bootloader uImage ramdisk [system][data][cache][storage]}
100 bootloader--->uImage--->ramdisk /
101 /system  挂载system分区
102 /data    挂载data分区
103 /cache   挂载cache分区
104 /storage 挂载storage分区
105 Linux:
106 emmc{bootloader uImage [rootfs]}
107 
108 8)搭建嵌入式开发环境之刷Linux系统
109 a)制作刷机sd卡          /dev/sdb2
110 sd{  80M(uboot)  [   ]  [  ]}
111 /dev/sdb       /dev/sdb1
112 bootloader 513字节
113 芯片要求 
114 S5P6818--->rom---->513
115 <详细内容请查看视频>
116 
117 b)把uboot烧写到sd卡
118 sudo dd if=ubootpak.bin of=/dev/sdb seek=1
119 sync
120 
121 c)配置minicom
122 作用:能够操作PC的串口
123 115200 8N1
124 
125 d)刷机 Linux
126 emmc{ubootpak.bin [boot.img][rootfs.ext2][][][][][]}
127 /dev/mmcblk0
128 /dev/mmcblk0p1
129 /dev/mmcblk0p2
130 bootloader--->uImage---->rootfs
131 
132 e)修改uboot环境变量
133 倒数3秒
134 [zyli@Uboot]# set bootcmd "ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000"
135 [zyli@Uboot]# set bootargs root=/dev/mmcblk0p2 tp=gslx680-linux
136 [zyli@Uboot]# save
137 拔出sd卡
138 f)重启开发板
139 [zyli@Uboot]# reset
140 相关内容请查看:<minicom配置.mp4>  <刷机(linux).mp4>  <制作sd卡分区.mp4>
141 
142 soc+ddr(1G)+emmc(8)
143     socs5p6818支持3中启动方式:.sd卡 .emmc .usb
144     sd卡中的bootloader运行:bootloader提供一个命令fastboot
145 
146     9)搭建嵌入式开发环境之刷Android系统
147     相关内容请查看:<刷机Android.mp4>
148 
149 10)编译嵌入式系统ROM(Linux)
150     a)bootloader
151     相关内容请查看:<编译uboot.mp4>
152     b)kernel
153     tar -xvf linux-3.4.tar.bz2
154     cd kernel
155     vim Makefile
156     CROSS_COMPILE=
157     make x6818_defconfig
158     make menuconfig
159     make -j4                
160     make uImage
161 
162     编译完成的内核在<linux_src>/arch/arm/boot/uImage
163     接下来要把uImage打包到boot.img中
164     tar -xvf boot.tar.bz2
165     cp ../src/kernel/arch/arm/boot/uImage boot/
166     ./make_ext4fs -s -l 64M -L linux boot.img ./boot
167 
168     c)rootfs
169     /
170     [------------------[/bin /sbin /usr/bin /usr/sbin /etc /dev /var ..../root /home/xxx]]        
171     busybox工具集
172     mplayer
173     mpg123
174     qt库
175     sqlite
176     mysql
177     python    
178 
179     buildroot 工具
180     ----->rootfs
181 
182     tar -xvf buildroot.tar.bz2
183     cd buildroot
184     make x6818_defconfig
185     make -j4
186 
187     编译过程中ncruse出错
188     vim output/build/host-ncurses-5.9/include/curses.tail
189     删掉/* generate */
190     make -j4
191 
192     11)bootloader  kernel rootfs运行方式
193     刷机: bootloader kernel rootfs----->都在emmc
194 
195     开发:
196     booloader--->sd卡
197     kernel------>在PC,由bootloader通过网络下载到板子的内存
198     rootfs------>在PC,板子的内核启动后通过nfs挂在根文件系统
199 
200     总结:
201     1.理论基础:嵌入式 物联网 Android/Linux arm/SOC
202     2.刷机:Linux/Android
203     原因:产品
204     3.下载内核:tftp
205     原因:开发阶段不希望重复刷机
206     4.网络文件系统:nfs
207     原因:方便开发板和PC之间的文件共享
208 
209     12)配置tftp    
210     保证:1.sd卡中有bootloader
211     2.开发板和电脑链接:串口线  网线
212     3.启动minicom
213     4.启动开发板,在minicom中显示uboot的终端
214     配置方法参考<www.embsky.com>
215 
216     13)nfs 网络文件
217     开发板的根是PC的一个目录,在开发内核驱动和应用程序的时候非常方便
218 
219 
220     14)arm架构和arm汇编
221     arm 先进的精简指令集(RISC)处理器
222     x86 51  CISC
223 
224     SOC=arm+总线+控制器+...
225 
226     参考/home/zyli/6818/s5p6818sdk_lzy1/extern/ARM架构手册.pdf P42
227     经典处理器有七种工作模式
228     1.用户模式  user    10000 执行用户态进程
229     2.系统模式  system          Linux系统不用
230     3.管理模式  svc        10011 uboot/Linux内核
231     4.中断模式  irq        10010 处理中断
232 5.快速中断  irq              处理快速中断(默认Linux不启动)
233     6.中止模式  abt              处理内存非法访问
234     7.未定义    unde          处理未定义指令
235 
236     8.虚拟化模式
237     9.安全模式
238 
239     模式1是普通模式
240     模式2-模式7是特权模式
241     模式3-模式7是异常模式
242 
243     有个寄存器CPSR[4:0]用来决定和表示当前的模式
244     只有特权模式才能写CPSR[4:0]
245 
246     系统调用  open
247     软件:用户态<--->内核态
248     硬件:user模式<--->管理模式
249     |
250     软中断 swi/svc
251     arm平台的所有系统调用都是基于swi/svc指令的
252 
253     重启/开机        reset异常 -----> 管理模式    
254     触摸屏/TIMER     中断异常  -----> 中断(快速中断)模式
255     未定义指令       未定义异常 ----> 未定义模式
256     访问非法内存    中止异常  -----> 中止模式
257     执行进程        进程调度  -----> 用户模式
258 
259 
260     ARM=Arm_Core+TCM+Cache+协处理器+        MMU + .........
261     |          |   |      |-协助处理器    |-虚拟地址到物理地址的转换
262     |          |   |      |-CP15 CP14 CP11 CP10
263 |          |   |-控制器(把数据缓存到cache或者刷cache)
264     |          |   |-I-cache D-cache
265     |          |-内存  
266     |-执行代码
267     |-寄存器r0,r1,...,r15    
268 
269 
270     架构:
271     冯诺依曼架构 arm7 8086
272     指令和数据不分离
273     哈佛架构 arm9 ..... 
274     指令和数据分开存储
275     流水线:
276     取指    把指令从内存取到cpu
277     译码    翻译执行
278     执行    执行指令
279 
280     7-------------
281     6-------------
282     5-------------
283     4-------------
284     3-------------  取指
285     2-------------  取指 译码
286     1-------------  取指 译码 执行
287 
288     寄存器:R0-r15
289     R0-r12
290 
291     R13  SP stack pointer         栈
292     R14  LR    link register         函数返回地址
293     R15  PC process counter        正在被取指的指令
294     PC指向正在被取指的指令的下下条指令
295 
296     15)arm汇编
297     arm指令集        32位
298     thumb指令集        16位
299     thumb2指令集        16/32位
300 
301     arm-cortex-m     thumb2
302     arm-cortex-a     arm
303 
304     <参考arm汇编常用指令.pdf>
305 
306     16)安装交叉编译器
307     [extern]$ tar -xvf arm-linux-gcc-4.5.1.tar.bz2
308     [bin]$ vim ~/.bashrc     
309     最后一行添加如下:
310     PATH=/home/zyli/6818/s5p6818sdk_lzy1/extern/4.5.1/bin:$PATH
311     [bin]$ source ~/.bashrc
312 
313     17)arm汇编指令
314     mov 寄存器,寄存器/立即数
315     mov r0, r1  //r0=r1
316     mov r0, #20 //r0=20        
317 
318     add 寄存器1,寄存器2,寄存器3/立即数
319     寄存器1=寄存器2+寄存器3/立即数
320     sub 寄存器1,寄存器2,寄存器3/立即数
321     寄存器1=寄存器2-寄存器3/立即数    
322     mul 寄存器1,寄存器2,寄存器3
323     寄存器1=寄存器2*寄存器3
324     div 寄存器1, 寄存器2, 寄存器3
325     寄存器1=寄存器2/寄存器3
326     adc 寄存器1,寄存器2,寄存器3/立即数
327 寄存器1=寄存器2+寄存器3/立即数+CPSR_C(进位)
328     sbc 寄存器1,寄存器2,寄存器3/立即数
329 寄存器1=寄存器2-寄存器3/立即数-!CPSR_C(借位)
330 
331     伪指令: ldr 寄存器,=数字   
332     寄存器=数字
333 
334 
335 
336     注意:表脚指令不需要+s就能影响CPSR的标志位
337     cmp 寄存器,寄存器1/立即数 寄存器-寄存器1/立即数---->CPSR_NZ
338     条件执行: eq ne lt gt ge le
339 
340     teq 寄存器,寄存器1/立即数    
341     寄存器^寄存器1/立即数
342 
343     位  & | ^ ~
344     and 寄存器,寄存器1,寄存器/立即数
345     寄存器=寄存器1 & 寄存器/立即数
346     orr 寄存器,寄存器1,寄存器/立即数
347     寄存器=寄存器1 | 寄存器/立即数
348     eor 寄存器,寄存器1,寄存器/立即数
349     寄存器=寄存器1 ^ 寄存器/立即数
350     mvn 寄存器,寄存器/立即数
351     寄存器=~寄存器/立即数
352 
353     >> <<
354     mov 寄存器, 寄存器1, lsl 寄存器2/立即数 
355     寄存器 = 寄存器1 << 寄存器2/立即数
356     去掉高位,低位补0
357     mov 寄存器, 寄存器1, lsr 寄存器2/立即数 
358     寄存器 = 寄存器1 >>> 寄存器2/立即数
359     去掉低位,高位补0
360     mov 寄存器, 寄存器1, asr 寄存器2/立即数 
361     寄存器 = 寄存器1 >> 寄存器2/立即数
362     去掉低位,高位补符号位
363     mov 寄存器, 寄存器1, ror 寄存器2/立即数 
364     寄存器 = 寄存器1 <<>> 寄存器2/立即数
365     去掉低位,补到高位
366 
367     bic 寄存器1,寄存器2,寄存器3/立即数
368     寄存器1 = 寄存器2 & ~寄存器3/立即数    
369 
370     练习:
371     //ledcon = ledcon | (1 << 3)
372     ledcon |= 1 << 3
373     伪码:
374     mov r0, #1
375     //orr %0, %0, r0, lsl #3
376     orr %0, r0, lsl #3
377 
378 ledcon &= ~(1 << 3)
379     伪码:
380     mov r0, #1
381     mvn r1, r0, lsl #3
382     and %0, r1
383 
384     bic %0, %0, #(1 << 3)
385 %0=%0&~(1 << 3)
386 
387 
388     swi/svc
389     系统调用
390     char *s = "helloworld\n";
391     write(1, s, strlen(s));
392 
393     write的实现:
394     syscall(4, 1, s, strlen(s));
395     syscall的实现:
396     mov r0, #1
397     mov r1, %0
398     mov r2, #11
399     mov r7, #4
400     swi 100---------->进入内核,内核获取r7的值,根据r7的值在系统调用表中找到对应的系统调用    
401 
402 
403     ldr 把数据从内存加载到寄存器
404     str 把数据从寄存器放到内存
405 
406 
407     ldr 寄存器,地址    寄存器=*地址
408     str 寄存器,地址       *地址=寄存器
409 
410 mov 寄存器, 寄存器/立即数(地址)
411     ldr 寄存器1, [寄存器]   寄存器1=*寄存器
412     str 寄存器1, [寄存器]   *寄存器=寄存器1
413 
414 ldr 寄存器1, [寄存器, #4]  寄存器1=*(寄存器+4)
415     ldr 寄存器1, [寄存器, #4]! 寄存器+=4 寄存器1=*寄存器
416 
417     ldr 寄存器1, [寄存器], #4  寄存器1=*寄存器  寄存器+=4
418     str 寄存器1, [寄存器], #4  *寄存器=寄存器1  寄存器+=4
419 
420 
421     b  标号(地址)
422 bl 标号(地址) 在跳转之前会把下一条指令的地址存放到LR(R14)
423     bx 寄存器
424 
425 汇编综合练习(代码分析)
426     1.函数调用
427     2.a++ + ++a + a++ + ++a .....
428 
429     总结:
430     .嵌入式基础
431     .刷机(产品发布)
432     .tftp(下载内核) nfs(挂在网络文件系统) (开发)
433     .arm架构  arm汇编  (了解)
434 
435 18)SOC裸板开发(不基于操作系统)
436     目的:熟悉板子
437     GPIO 通用的输入输出口
438     管脚----------输入 输出 其他
439     输出:控制   SOC---------LED--R--VCC
440     输入:检测   SOC---------Sensor
441     其他:串口等 SOC--------->
442 
443 推挽输出(能高能低)
444 
445     S5P6818一共有160个管脚为GPIO 分为5组 每组32个
446     SOC:Arm--->GPIO控制器(每一组io一个控制器)----->IO管脚
447     |-寄存器(地址) SFR
448 
449     具体寄存器参考S5P6816的datasheet
450     GPIOXOUT[31:0]
451 控制管脚电平的高低(输出)
452 
453     GPIOXOUTENB[31:0]
454     决定GPIO功能
455 
456     GPIOXPAD[31:0]
457 检测管脚状态(输入)
458 
459     GPIOx_PULLSEL[31:0]
460     选择上拉或者下拉电阻    
461 
462     GPIOx_PULLSEL_DISABLE_DEFAULT[31:0]
463     上拉电阻和下拉电阻的默认选择
464 
465     GPIOx_PULLENB[31:0]
466     选择是否需要上拉或者下拉电阻
467 
468     GPIOx_PULLENB_DISABLE_DEFAULT[31:0]
469     上拉/下拉电阻的使能/禁止的默认选择        
470 
471     .
472     ├── inc
473     │   ├── common.h
474     │   ├── hw.h
475     │   └── lib.h
476     ├── Makefile
477     ├── ReadMe.txt
478     └── src
479     ├── hw.c
480     ├── lib.c
481     ├── main.c
482     ├── Makefile
483     └── start.s                
484 
485     arm-linux-gcc main.c -c -o main.o -I ../inc
486     arm-linux-gcc hw.c -c -o hw.o -I ../inc
487     arm-linux-gcc lib.c -c -o lib.o -I ../inc
488     arm-linux-as start.s -o start.o
489     arm-linux-ld start.o main.o lib.o hw.o -o arm -Ttext 0x50000000
490     arm-linux-objcopy -O binary arm arm.bin
491 
492     借用Uboot的printf
493     调用函数:1.通过名字调用
494 2.通过函数指针(地址)
495 
496     Uboot在内存的0x43c00000运行:在Uboot的System.map文件中能够看到Uboot中多有函数的地址
497 
498     printf--->标准输出---->终端
499     开发板的终端设备是串口
500 
501     UART
502     S5P6818 的串口是3.3v
503 
504     ttl/232/485        
505     ttl:3.3V/5V------->1
506     0V------------>0
507     232: -3v -12v----->1
508     3v   12v----->0
509     485: 模拟 差分信号
510 
511 
512     ttl/232
513     ---->>>>------------------------------
514     ----<<<<------------------------------
515 
516     485/usb/eth
517     ----->>>>>--------------------------------
518     ----->>>>>--------------------------------
519 
520     ttl<--max232-->232
521     ttl<--max485-->485
522 
523     115200     8N1    
524 
525     串口配置流程:
526     1.GPIO其他功能
527     2.数据格式8N1
528     3.关闭FIFO
529     [UTXH]  FIFO--------------------------->
530     [URXH]  FIFO<---------------------------
531     4.关掉AFC
532     5.波特率115200
533 
534     6.发送数据
535     7.接收数据
536 
537     19)Linux内核驱动
538     查看Linux内核
539     ctags
540     1.解压内核源码
541     tar -xvf linux-3.4.tar.bz2
542     2.进入内核
543     cd kernel
544     3.创建索引
545     ctags -R .
546 
547     查看:
548     vim -t memcpy
549     :cstag memcpy
550     ctrl+]
551     ctrl+o
552 
553     在内核中添加自己的代码
554     cd kernel-3.4
555     mkdir drivers/zmb
556     touch drivers/zmb/test.c
557     touch drivers/zmb/Makefile
558     vim drivers/Makefile
559     obj-y += zmb/
560     vim drivers/zmb/Makefile
561     obj-y += test.o
562     vim drivers/zmb/test.c
563     内容参考具体文件
564     make
565     make uImage
566 
567     接下来启动内核,在启动过程中观察我们自己的代码启动
568 
569     在内核中添加自己的配置选项
570 make menuconfig ------> 提供一个配置界面(用来做内核裁剪)
571     例子1:通过make menconfig来配置test.c是否要编译到内核
572     touch drivers/zmb/Kconfig
573     vim drviers/zmb/Kconfig
574     config MY_TEST
575     bool "My Test Support"
576     default n
577     help
578     If you select this you will be happy
579     vim drivers/Kconfig
580     source "drivers/zmb/Kconfig"
581 
582     插曲:
583 ##################################################################
584 ###Kconfig--->make menuconfig--->[*]/[]----->.config           ###
585 ###                   |  |-CONFIG_MY_TEST=n           ###
586 ###                   |-CONFIG_MY_TEST=y              ###
587 ###--->make-->include/generated/autoconf.h  --->提供给C文件使用###
588 ###        |-#define CONFIG_MY_TEST 1                     ###
589 ###    -->include/config/auto.conf -------->提供给Makefile使用###
590 ###        |-CONFIG_MY_TEST=y                             ###
591 ##################################################################
592 
593     vim drivers/zmb/Makefile
594     obj-$(CONFIG_MY_TEST) += test.o        
595     make 
596     make uImage
597 
598     接下来启动内核,在启动过程中观察我们自己的代码启动
599 
600     例子2:能够控制条件编译的选项
601     touch drivers/zmb/test1.c
602     参考具体文件
603     vim drivers/zmb/Makefile
604     obj-$(CONFIG_MY_TEST1) += test1.o    
605     vim drivers/zmb/Kconfig
606     config MY_TEST1
607     bool "MY TEST1 Support"
608     default n
609     help
610     If you ........
611 
612     config FUN_ENABLE
613     bool "FUN_ENABLE Support"
614     depends on MY_TEST1
615     default n
616     help
617     If you ......
618     make menuconfig
619     make
620     make uImage
621 
622     接下来启动内核,在启动过程中观察我们自己的代码启动
623     注意:如果printk的消息级别不够的化,printk打印的东西会放到缓存而不会显示到终端
624     注意:查看缓存的命令dmesg
625 
626     例子3:目录型选项
627     cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak
628     vim drivers/zmb/Kconfig
629     在开头加menu "xxxxxxx"
630     在结尾加endmenu        
631 
632     例子4:能够控制的目录型选项
633     cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak1
634     vim drivers/zmb/Kconfig
635     参考具体文件
636     vim drivers/Makefile
637     obj-$(CONFIG_ZMB_TEST)          += zmb/
638 
639     例子5:
640     vim drivers/zmb/test1.c
641     在test_init函数中添加:
642     for (i = 0; i < CONFIG_PRINTK_COUNT; i++)
643     printk("%s\n", CONFIG_PRINTK_CONTENT);    
644     vim drivers/zmb/Kconfig
645     if MY_TEST1
646     config PRINTK_COUNT
647     int "printk count"
648     default 5
649     range 0 100
650     help
651     If .....
652     config PRINTK_CONTENT
653     string "printk content"
654     default "I am Kernel"
655     help
656     If .....
657     endif    
658 
659     例子6:多选一
660     vim drivers/zmb/Kconfig
661     choice
662     prompt "select you ts type"
663     config MY_TS1
664     bool "my ts1"
665     config MY_TS2
666     bool "my ts2"
667     config MY_TS3
668     bool "my ts3"
669     endchoice
670 
671     要求:根据选择的不同代码在启动的时候要打印不同的信息    
672 
673     代码参考<code>/kernel/01code_in_kernel
674 
675     总结:把代码编译到内核 有点:方便 缺点:修改代码后要重新编译内核和升级内核
676 
677     内核模块
678     可以把内核代码写成模块
679     模块可以在内核启动之后动态安装或者卸载
680     注意:1.编译内核模块需要用到编译通过的内核源码
681     2.在板子中运行的内核和编译模块的内核必须由同一套内核来编译
682 
683     insmod 内核模块.ko
684     rmmod  内核模块.ko
685     lsmod  用来查看当前内核中的模块
686 
687     代码参考<code>/kernel/02module
688 
689     字符设备
690     代码参考<code>/kernel/03cdev    
691 
692 
693     app:系统调用 open close ioctl read write select poll ....
694     /dev/led  /dev/wdt
695     ------------------------------------------------------
696     kernel:
697     led_driver wdt_driver ......
698     ------------------------------------------------------
699     SOC:寄存器 
700     led  wdt  uart  lcd  ts  net  wifi  iic  spi  eeprom ....
701 
702     字符设备------>lcd led ts uart wdt adc eeprom ......
703     块设备-------->sd卡 硬盘 emmc nand ......
704     网络设备------>网卡
705 
706     复习:fd = open("/dev/led", O_RDWR)
707     struct data_st {
708         int no
709             int on;
710     }led;    
711 led.no = 1;
712 led.on = 1;
713 write(fd, &led, sizeof(led));
714 
715 字符设备
716 设备号:主设备号+次设备
717 cat /proc/devices
718 
719 open close read write ioctl
720 
721 /dev/mydevice /dev/myhehe
722 |-15:1    |-15:2
723 --------------------------------------------------    
724 kernel
725 <--->cdev<-->cdev<--->cdev<--->cdev<--->
726 |-dev设备号15:1
727 |-count数量 3
728 |-ops--->file_operations
729 .open----------------->my_open
730 .release-------------->my_release
731 .write---------------->my_write
732 .read----------------->my_read
733 .unlocked_ioctl------->my_ioctl
734 ---------------------------------------
735 hardware
736 
737 struct cdev    
738 
739 20)项目

 

note

标签:lap   嵌入式   sizeof   作用   单片机   devices   read   sys   tags   

原文地址:https://www.cnblogs.com/axjlxy/p/8922670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!