1. 編譯cboot

1.1 下載cboot程式碼

Jetson AGX Xavier Series、Xavier NX and TX2 Series所使用的bootloader和其他Nvidia所開發的嵌入式系統不太一樣。這三個系列使用的是cboot,其他則是u-boot 。cboot的程式碼可以至Nvidia官方網站下載 

選擇36.6.1
選擇32.6.1

選擇適合的cboot程式碼
根據所使用系統選擇適合的cboot版本。Xavier AGX和Xavier NX是T194,TX2則是T186。

下載後,依照以下步驟解壓縮。以下本文皆以Xavier NX的cboot為例:

$ mkdir cboot
$ tar -xjf cboot_src_t194.tbz2 -C cboot


1.2 下載編譯需要的Toolchain

編譯cboot需要cross compile。因此我們需要下載相對應的Toolchain。同樣去1.1內的Nvidia的網站上面即可下載到Toolchain。

下載Toolchain

下載後,使用以下的命令解壓縮:

$ tar -xvpJf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz


1.3 編譯

先至1.1解壓縮的目錄:

$ cd cboot

在編譯之前要export一些環境變數: 

$ export CROSS_COMPILE=<your_64-bit_ARM_toolchain>
$ export TEGRA_TOP=$PWD
$ export TOP=$PWD

其中<your_64-bit_ARM_toolchain>是你的toolchain解壓縮後的位置。以1.2為例的話 應該設定為:

$ export CROSS_COMPILE=gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

接下來就可以開始編譯了。

$ make -C ./bootloader/partner/t18x/cboot PROJECT=t194 TOOLCHAIN_PREFIX="${CROSS_COMPILE}" DEBUG=2 BUILDROOT="${PWD}"/out NV_TARGET_BOARD=t194ref NV_BUILD_SYSTEM_TYPE=l4t NOECHO=@


編譯完成後。如果沒有問題,那就會在cboot/out/build-t194底下看到檔案lk.bin。 將lk.bin改名為cboot_t194.bin,並複製到Linux_for_Tegra/bootloader底下取代舊有的cboot_t194.bin。再重燒Xavier NX即可。


2. 控制GPIO

2.1 相關函數

主要參考cboot/bootloader/partner/common/include/drivers底下的tegrabl_gpio.h。

tegrabl_gpio_driver_get取得與gpio pin相對應的struct gpio_driver。
gpio_config設定gpio pin 輸入或是輸出模式。
gpio_read 當gpio pin設定為輸入時,使用此函數讀取gpio pin的狀態。
gpio_write 當gpio pin設定為輸出時,使用此函數改變gpio pin的狀態。

2.1 Example

以下以設定GPIO01為GPIO Input為範例:

struct gpio_driver *gpio_drv;
tegrabl_error_t err = TEGRABL_NO_ERROR;
uint32_t chip_id = TEGRA_GPIO_MAIN_CHIPID;
gpio_pin_state_t pin_state;

//GPIO01位於Main Chip
err = tegrabl_gpio_driver_get(chip_id, &gpio_drv);
if (err == TEGRABL_NO_ERROR) {
    //設定GPIO01為Input mode. GPIO01的pin number為TEGRA_GPIO(Q,5)
    err = gpio_config(gpio_drv, TEGRA_GPIO(Q,5), GPIO_PINMODE_INPUT);
    if (err == TEGRABL_NO_ERROR) {
        //讀取GPIO01的狀態
        err = gpio_read(gpio_drv, TEGRA_GPIO(Q,5), &pin_state);
        if (err == TEGRABL_NO_ERROR) {
            pr_info("GPIO status:%u\n",pin_state);
        }
    }

那GPIO01的pin number是怎樣得知的呢?這個就要去Nvidia官方網站下載Xavier NX的pinmux表得知。

Jetson Xavier NX的Pinmux表

透過查詢Pinmux表。我們可以知道GPIO01是GPIO3_PQ.05 那GPIO01所在的BANK ID為Q,pin index為5。因此為TEGRA_GPIO(Q,5)。


GPIO01為GPIO3_PQ.05


另外,根據不同的BANK ID我們需要在tegrabl_gpio_driver_get中輸入相對應的chip id。可以參考cboot/bootloader/partner/t19x/common/include/soc/t194/tegrabl_gpio_hw.h。例如BANK ID 為AA的GPIO,那他的chip id 就是 TEGRA_GPIO_AON_CHIPID。

arrow
arrow

    阿轟師 發表在 痞客邦 留言(0) 人氣()