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中啓動方式:1.sd卡 2.emmc 3.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 1.嵌入式基礎 431 2.刷機(產品發佈) 432 3.tftp(下載內核) nfs(掛在網絡文件系統) (開發) 433 4.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)項目
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中啓動方式:1.sd卡 2.emmc 3.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 1.嵌入式基礎 431 2.刷機(產品發佈) 432 3.tftp(下載內核) nfs(掛在網絡文件系統) (開發) 433 4.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)項目