“Nghịch”U-boot


      HND
  Tháng 9, 2012
Phần 1

LÝ 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_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?
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.
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…
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á”.
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.
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.
Phần 2

CHUẨ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ớ có tunnel proxy để vượt tường lửa ->
    truy cập facebook(giải thích sau).
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.
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
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
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ố hardware cần lưu ý:
    • DDR: có dung lượng 128MBytes, bắt đầu từ địa chỉ:
      0xc0000000
    • UART:
    • NAND flash:
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
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
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
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 đó.
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
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 ý.
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?
• Sự cần thiết của driver.
• Các driver cần lưu ý:
  – UART.
  – Ethernet.
  – NAND flash.
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.
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 …
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).
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.
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
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
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
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ỡ.
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

U boot

  • 1.
    “Nghịch”U-boot HND Tháng 9, 2012
  • 2.
    Phần 1 LÝ DOPHẢI NGHỊCH
  • 3.
    Build U-boot: vàithắ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.
  • 9.
    Phần 2 CHUẨN BỊ“NGHỊCH”
  • 10.
    Chuẩn bị môitrườ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ôitrườ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ôitrườ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
  • 14.
    Phần 3: B ẮTĐẦU “NGHỊCH”
  • 15.
    Môi trường phầncứ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