Successfully reported this slideshow.
“Nghịch”U-boot      HND  Tháng 9, 2012
Phần 1LÝ DO PHẢI NGHỊCH
Build U-boot: vài thắc mắc• Configure board:  – #make CROSS_COMPILE=arm-none-eabi-    da850evm_config.  – #make CROSS_COMP...
Tại sao “phá” U-boot(1)• Vai trò quen thuộc:  – Sử dụng U-boot như là bootloader: boot từ    flash(nor,nand,MMC), hay boot...
Tại sao “phá” U-boot(2)• Vai trò “phá”  – Dùng U-boot để học nhúng(embedded system).  – Dùng U-boot để phát triển ứng dụng...
Ai nên “phá” U-boot(1)• Các “tay mơ”( newbie) chưa biết gì U-boot  nên “phá”.• Chưa biết về nhúng.• Các chuyên gia làm boa...
Ai nên “phá” U-boot(2)• Cho Newbie:  – Làm quen với cách làm việc của open source: cài    đặt cross-compiler, Makefile, C ...
Ai nên “phá” U-boot(3)• Chuyên gia sản xuất development board  – Tạo u-boot phù hợp với board của mình( chẳng lẽ    cứ xài...
Phần 2CHUẨN BỊ “NGHỊCH”
Chuẩn bị môi trường “nghịch”(1)• Môi trường miễn phí:  – 1 máy tính “dỏm”, có cài Ubuntu(12.04 or higher).  – Internet: nh...
Chuẩn bị môi trường “nghịch”(2)• Trình biên dịch:   – Sử dụng Code Sourcery:      • Có phiên bản miễn phí:      • Có phiên...
Chuẩn bị môi trường “nghịch”(3)• Cài đặt cross-compiler:  – Chạy cài đặt Code Sourcery trên Ubuntu( chọn    thiết lập mặc ...
U-boot source code• Download phiên bản U-boot mới nhất từ  đây:http://ftp.denx.de/pub/u-boot/• Hiện tại( Tháng 9, 2012) ph...
Phần 3:B ẮT ĐẦU “NGHỊCH”
Môi trường phần cứng(1)• SBC8018.  – Sử dụng chip AM1808( tương đương L138,nhưng    không có khối DSP).  – Các tham số har...
Giải mã U-boot – Configuration(1)• Trước khi build u-boot,ta phải config source  code bằng lệnh:  – #make CROSS_COMPILE=ar...
Giải mã U-boot – Configuration(2)Giá trị          Ý NghĩaTarget           da850evm: tên của board. Do đó khi              ...
Giải mã U-boot - CPU• Từ bảng cấu hình, ta sẽ biết ngay đoạn mã  quan trọng nhất: startup code cho CPU của  board sẽ nằm ở...
Giải mã U-boot – Board• Code dành để cấu hình board(sau khi start up) sẽ nằm  ở:   – /board/vendor/board name: /board/davi...
Giải mã U-boot – “Đầu bự”• U-boot giấu file config cho từng board ở nơi  khá bí hiểm:  – includeconfigs• Toàn bộ các file ...
Giải mã U-boot – Xong• Tới đây về cơ bản ta đã biết đường đi lối lại của U-boot  khi nó configure, và biên dịch cho một bo...
Giải mã U-boot – Chữ nhiều quá   thêm cái hình cho dễ hiểu
Giải mã U-boot: Đã thật sự xong chưa?• Đã thật sự xong chưa? Liệu biên dịch thành  công thì nạp xuống board có ra gì không...
Giải mã U-boot: Driver• Điều chắc chắn: nếu board của bạn “mông má”  từ 1 board đã chạy rồi(lưu ý phần UART phải  giống nh...
Giải mã U-boot: Thực thi U-boot• U-boot được chạy như thế nào?  – Tất cả CPU sẽ có phần bootstrap, đoạn code nhỏ này    kh...
Giải mã U-boot: Driver• Vị trí source driver thường dùng:  – /driver/serial: dành cho serial  – /driver/mtd: memory techno...
Giải mã U-boot: Driver UART• Nhớ lại file “đầu bự” da850evm.h ở slide 19  – CONFIG_SYS_NS16550  – CONFIG_SYS_NS16550_SERIA...
Giải mã U-boot: Driver ethernet(1)• U-boot chia ethernet làm 2 phần:  – /net : có thể nói đây là lớp TCP/IP , phần này chắ...
Giải mã U-boot: Driver ethernet(2)• Việc cần làm khi port:   – Driver cho MAC quan trọng hơn PHY ( PHY gần như     không c...
Giải mã U-boot: Driver NAND               flash(1)• Define: CONFIG_USE_NAND nếu sử dụng  NAND.• Makefile trong /drivers/mt...
Giải mã U-boot: Driver NAND               flash(2)• Flash rất quan trọng:  – Nơi chứa biến môi trường.  – Nới chứa bản thâ...
Giải mã U-boot: Hết• Các điểm lưu ý:  – Khai báo Board : boards.cfg  – Board config: /include/configs/”boardname.h”  – CPU...
Upcoming SlideShare
Loading in …5
×

U boot

2,880 views

Published on

Nghịch U-boot

Published in: Education
  • Be the first to comment

U boot

  1. 1. “Nghịch”U-boot HND Tháng 9, 2012
  2. 2. Phần 1LÝ DO PHẢI NGHỊCH
  3. 3. Build U-boot: vài thắc mắc• Configure board: – #make CROSS_COMPILE=arm-none-eabi- da850evm_config. – #make CROSS_COMPILE=arm-none-eabi-• Cái gì thực sự chạy đằng sau các lệnh này? – File nào sẽ được khi gọi khi các lệnh trên được thực thi? – Liệu U-boot lấy từ trên mạng về, có chạy với board của mình hay không?
  4. 4. Tại sao “phá” U-boot(1)• Vai trò quen thuộc: – Sử dụng U-boot như là bootloader: boot từ flash(nor,nand,MMC), hay boot từ cách kênh giao tiếp như: ethernet, uart. – Sử dụng U-boot để gọi linux kernel: truyền arguments cho kernel.
  5. 5. Tại sao “phá” U-boot(2)• Vai trò “phá” – Dùng U-boot để học nhúng(embedded system). – Dùng U-boot để phát triển ứng dụng đơn(stand- alone application). – Dùng U-boot để thử nghiệm driver: GPIO,uart,spi, i2c, ethernet, flashs…
  6. 6. Ai nên “phá” U-boot(1)• Các “tay mơ”( newbie) chưa biết gì U-boot nên “phá”.• Chưa biết về nhúng.• Các chuyên gia làm board(hardware expert) nên “phá”.
  7. 7. Ai nên “phá” U-boot(2)• Cho Newbie: – Làm quen với cách làm việc của open source: cài đặt cross-compiler, Makefile, C source code. – Sau đó là làm quen với CPU: starup code, system configuration. – Làm quen với cách viết code trên C.
  8. 8. Ai nên “phá” U-boot(3)• Chuyên gia sản xuất development board – Tạo u-boot phù hợp với board của mình( chẳng lẽ cứ xài u-boot của người khác). – Cung cấp nhanh ứng dụng để test hardware.
  9. 9. Phần 2CHUẨN BỊ “NGHỊCH”
  10. 10. Chuẩn bị môi trường “nghịch”(1)• Môi trường miễn phí: – 1 máy tính “dỏm”, có cài Ubuntu(12.04 or higher). – Internet: nhớ có tunnel proxy để vượt tường lửa -> truy cập facebook(giải thích sau).
  11. 11. Chuẩn bị môi trường “nghịch”(2)• Trình biên dịch: – Sử dụng Code Sourcery: • Có phiên bản miễn phí: • Có phiên bản commercial(phòng khi dự án thành công,có tiền chuyển từ miễn phí sang). – Lưu ý khi download Code Sourcery: • Download phiên bản dành cho loại CPU nào(arm,intel,MIPS,…) • Môi trường để cài: Linux(Ubuntu), hay Windows. • Download the EABI Release: dành cho build U-boot,linux kernel( arm-none-eabi-) • Download the GNU/Linux Release: dành cho build ứng dụng để chạy trên linux(arm-none-linux-gnueabi-gcc- ),chưa cần thiết cho build U-boot,kernel linux.
  12. 12. Chuẩn bị môi trường “nghịch”(3)• Cài đặt cross-compiler: – Chạy cài đặt Code Sourcery trên Ubuntu( chọn thiết lập mặc định cho chắc). Nếu Ubuntu không cho chạy(do thiếu quyền) thì mở Terminal, và thiết lập: • #chmod +x “file cài đặt code sourcery” – Test cross-compiler: mở Terminal, chạy dòng lệnh sau: • #arm-none-eabi-gcc -v
  13. 13. U-boot source code• Download phiên bản U-boot mới nhất từ đây:http://ftp.denx.de/pub/u-boot/• Hiện tại( Tháng 9, 2012) phiên bản an toàn nhất là: 2012_04 ( tuy nhiên có vấn đề với đọc Nand flash của TI).• Giải nén u-boot: – #tar zvf u-boot-2012.04.tar.bz2
  14. 14. Phần 3:B ẮT ĐẦU “NGHỊCH”
  15. 15. Môi trường phần cứng(1)• SBC8018. – Sử dụng chip AM1808( tương đương L138,nhưng không có khối DSP). – Các tham số hardware cần lưu ý: • DDR: có dung lượng 128MBytes, bắt đầu từ địa chỉ: 0xc0000000 • UART: • NAND flash:
  16. 16. Giải mã U-boot – Configuration(1)• Trước khi build u-boot,ta phải config source code bằng lệnh: – #make CROSS_COMPILE=arm-none-eabi- da850evm_config• Vậy lệnh này ở đâu ra?• Kiểm tra file board.cfg sẽ có 1 trường dữ liệu:da850evm arm arm926ejs da8xxevm davinci davinci da850evm:MAC_ADDR_IN_SPIFLASH
  17. 17. Giải mã U-boot – Configuration(2)Giá trị Ý NghĩaTarget da850evm: tên của board. Do đó khi config board ta phải chạy lệnh: #make CROSS_COMPILE=arm-none-eabi- da850evm_configARCH armCPU arm926ejsBoard name da8xxevmVendor davinciSoc davinciOptions da850evm:MAC_ADDR_IN_SPIFLASH
  18. 18. Giải mã U-boot - CPU• Từ bảng cấu hình, ta sẽ biết ngay đoạn mã quan trọng nhất: startup code cho CPU của board sẽ nằm ở: – /arch/arch’value/cpu/cpu’s value/soc : arch/arm/cpu/arm926ejs/davinci
  19. 19. Giải mã U-boot – Board• Code dành để cấu hình board(sau khi start up) sẽ nằm ở: – /board/vendor/board name: /board/davinci/da8xxevm• Vấn đề xuất hiện: trong thư mục /board/davinci/da8xxevm có rất nhiều file .c cho từng loại board khác( da830 …) vậy căn cứ vào đâu để biên dịch đúng file da850evm.c: kiểm tra Makefile ta thấy: – COBJS-$(CONFIG_MACH_DAVINCI_DA850_EVM) += da850evm.o – Điều đó chứng tỏ CONFIG_MACH_DAVINCI_DA850_EVM đã được “define” đâu đó.
  20. 20. Giải mã U-boot – “Đầu bự”• U-boot giấu file config cho từng board ở nơi khá bí hiểm: – includeconfigs• Toàn bộ các file định nghĩa cho các board phải nằm ở đây dưới cái tên: “board_name”.h . Trong trường hợp cụ thể ở đây là: da850evm.h• Mở ra đúng phóc là có – #define CONFIG_MACH_DAVINCI_DA850_EVM
  21. 21. Giải mã U-boot – Xong• Tới đây về cơ bản ta đã biết đường đi lối lại của U-boot khi nó configure, và biên dịch cho một board mới.• Để cho rõ, ta nên làm một bài tập nhỏ sau: tạo “code base” trên u-boot hỗ trợ custom defined board như sau: CPU: am1808, board name: bullet, thiết kế giống như da850evm. Yêu cầu: các lệnh sau biên dịch thành công: – #make CROSS_COMPILE=arm-none-eabi- bullet_config – #make CROSS_COMPILE=arm-none-eabi-• Có thể làm cho atmel, samsung hay freescale arm9 đang có trên thị trường tùy ý.
  22. 22. Giải mã U-boot – Chữ nhiều quá thêm cái hình cho dễ hiểu
  23. 23. Giải mã U-boot: Đã thật sự xong chưa?• Đã thật sự xong chưa? Liệu biên dịch thành công thì nạp xuống board có ra gì không?• Sự cần thiết của driver.• Các driver cần lưu ý: – UART. – Ethernet. – NAND flash.
  24. 24. Giải mã U-boot: Driver• Điều chắc chắn: nếu board của bạn “mông má” từ 1 board đã chạy rồi(lưu ý phần UART phải giống nhé), quá trình tạo code giống như đã trình bày ở trên, thì console chắc cú là xuất ra dòng: #u-boot>• Vậy phải làm gì tiếp theo? Driver tiếp là cái chắc vì: – Ngoại vi chắc chắn là khác với board gốc. – Chân cẳng cũng khác.
  25. 25. Giải mã U-boot: Thực thi U-boot• U-boot được chạy như thế nào? – Tất cả CPU sẽ có phần bootstrap, đoạn code nhỏ này khởi tạo PLL, SRAM, SDRAM… Bootstrap này có sẵn hay có thể nạp vào SRAM của CPU bằng JTAG. – Nếu boot từ flash(nor, nand, spi), bootstrap sẽ truy cập( driver đọc flash tích hợp sẵn trong bootstrap) và đọc file(trong trường hợp này là u-boot) và để lên SDRAM. – Sau đó nhảy đến SDRAM tại địa chỉ vừa load để thực thi file. – Vì bootstrap chạy trên SRAM, nên nó khá nhỏ nên thường không có serial, ethernet …
  26. 26. Giải mã U-boot: Driver• Vị trí source driver thường dùng: – /driver/serial: dành cho serial – /driver/mtd: memory technology device, nor nand và các loại flash vào đây. – /driver/gpio – /driver/net: lưu ý là các driver cho PHY device thường lại được đặt khá lung tung • /driver/net/phy. • Đôi khi nằm cùng vị trí với CPU,hoặc board( đề cập slide 17/18).
  27. 27. Giải mã U-boot: Driver UART• Nhớ lại file “đầu bự” da850evm.h ở slide 19 – CONFIG_SYS_NS16550 – CONFIG_SYS_NS16550_SERIAL• Tham chiếu vào Makefile ở /drivers/serial ta sẽ biết những file nào sẽ biên dịch để sử dụng là driver cho board.
  28. 28. Giải mã U-boot: Driver ethernet(1)• U-boot chia ethernet làm 2 phần: – /net : có thể nói đây là lớp TCP/IP , phần này chắc chắn đúng, và ít khi cần port lại. – /drivers/net và /drivers/net/phy: tương ứng cho lớp MAC và PHY, cần port mỗi khi làm cho board mới. – Đầu mối kết hợp giữa 2 phần trên được thực hiện trong phần khởi tạo board, với sbc8018 thì trong hàm davinci_emac_initialize gọi bởi cpu_eth_init
  29. 29. Giải mã U-boot: Driver ethernet(2)• Việc cần làm khi port: – Driver cho MAC quan trọng hơn PHY ( PHY gần như không cần, chỉ cần theo đúng generic PHY). – Nếu liên kết giữa MAC và PHY theo truyền thống( MII hay RMII). • MAC phát hiện,điều khiển PHY sử dụng MDC. • Dữ liệu trao đổi giữa MAC và PHY qua các đường IO độc lập với MDC -> MAC có thể không phát hiện PHY nhưng vẫn giao tiếp dữ liệu được. – Các loại khác: usb, com … : chưa biết. – Với sbc8018: căn cứ và Makefile trong /drivers/net để biết driver MAC nào được sử dụng: • COBJS-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o
  30. 30. Giải mã U-boot: Driver NAND flash(1)• Define: CONFIG_USE_NAND nếu sử dụng NAND.• Makefile trong /drivers/mtd/nand cho ta biết file driver của NAND: – COBJS-$(CONFIG_NAND_DAVINCI) += davinci_nand.o• Cung cấp các tham số để driver cấu hình: – #define CONFIG_SYS_NAND_BASE DAVINCI_ASYNC_EMIF_DATA_CE3_BASE – #define CONFIG_SYS_NAND_PAGE_2K – #define CONFIG_SYS_NAND_CS 3
  31. 31. Giải mã U-boot: Driver NAND flash(2)• Flash rất quan trọng: – Nơi chứa biến môi trường. – Nới chứa bản thân u-boot, đồng thời là các app được gọi bởi u-boot( user app hay linux kernel , rootfs).• Cấu hình environment: – CONFIG_ENV_IS_IN_NAND : biến môi trường trong nand flash. – CONFIG_ENV_OFFSET: có thể ở đầu flash(block 0 hay ở đoạn cuối flash). – CONFIG_ENV_SIZE: kích cỡ.
  32. 32. Giải mã U-boot: Hết• Các điểm lưu ý: – Khai báo Board : boards.cfg – Board config: /include/configs/”boardname.h” – CPU/Board initialize: /arch/arch’value/cpu/cpu’s và /board/vendor/”boardname” – Makefile ở trong các thư mục driver. • /drivers/serial • /drivers/mtd/nand, /drivers/mtd/nor • /drivers/net, /drivers/net/phy

×