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\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)項目
相關文章
相關標籤/搜索