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. 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. 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. 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. 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. 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.
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. 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. 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. 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
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. 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. Giải mã U-boot – Configuration(2)
Giá trị Ý Nghĩa
Target da850evm: tên của board. Do đó khi
config board ta phải chạy lệnh: #make
CROSS_COMPILE=arm-none-eabi-
da850evm_config
ARCH arm
CPU arm926ejs
Board name da8xxevm
Vendor davinci
Soc davinci
Options da850evm:MAC_ADDR_IN_SPIFLASH
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. 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. 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. 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. Giải mã U-boot – Chữ nhiều quá
thêm cái hình cho dễ hiểu
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. 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. 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. 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. 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. 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. 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. 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. 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. 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