• note


      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
    ";
    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
    ", 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
    ";
    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
    ", 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)项目
    有时候,不小心知道了一些事,才发现自己所在乎的事是那么可笑。
  • 相关阅读:
    project b2c_performance / capacity
    WebServer Roxen
    OS + UNIX AIX /etc/services
    但行好事,莫问前程 All In One
    学习什么语言的问题,其实,不是一个问题......
    不想当将军的学生,不是好程序员——数据访问层DAL
    C#如何用Graphics画出一幅图表
    混蛋的面试题——《大话设计模式》读后感
    编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)
    C#如何开发扫雷游戏
  • 原文地址:https://www.cnblogs.com/axjlxy/p/8922670.html
Copyright © 2020-2023  润新知