天天看點

總結與不足感悟

從yocto開始

什麼是yocto

Yocto項目是一個開源協作項目,可幫助開發人員建立基于Linux的定制系統,這些系統專為嵌入式産品而設計

imx8搭建yocto環境

注意:不能使用root使用者搭建yocto環境

基于yocto手冊《i.MX Yocto Project User’s Guide》

  1. 安裝必要的軟體包
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \  
build-essential chrpath  socat  libsdl1.2-dev
           

2.設定repo下載下傳功能

Repo 是一個建構在 Git 之上的工具,它可以更輕松地管理包含多個存儲庫的項目,這些存儲庫不需要位于同一台伺服器上。 Repo 很好地補充了 Yocto 項目的分層特性,使使用者可以更輕松地将自己的層添加到 BSP

要安裝“repo”實用程式,請執行以下步驟

1.  Create a bin folder in the home directory.
	 $ mkdir ~/bin (this step may not be needed if the bin folder already exists)
	 $ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo  > ~/bin/repo
	 $ chmod a+x ~/bin/repo
2.Add the following line to the .bashrc file to ensure that the ~/bin folder is in your PATH variable.
	export PATH=~/bin:$PATH
           

3.設定yocto工程

1.首先確定使用以下指令正确設定了 git
	$ git config --global user.name "Your Name"
	$ git config --global user.email "Your Email"
	$ git config --list
2.repo同步
	$ cd /opt/yocto
       $ mkdir fsl-release-bsp
       $ cd fsl-release-bsp
       $ repo init -u git://git.freescale.com/imx/fsl-arm-yocto-bsp.git -b imx-4.1-krogoth
       $ repo sync
           

4.建構鏡像

i.MX 提供了一個腳本 fsl-setup-release.sh,可簡化 i.MX 開發闆的設定,要使用該腳本,需要指定要為其建構的開發闆的類型以及所需建構的鏡像類型

1.設定腳本環境
	$ DISTRO=<distro name> MACHINE=<machine name> source fsl-setup-release.sh -b <build dir>
	distro name有如下選擇
	 fsl-imx-x11 //Only X11 graphics
	 fsl-imx-wayland // Wayland weston graphics
	 fsl-imx-xwayland //Wayland graphics and X11. X11 applications using EGL are not 
	 supported
	 fsl-imx-fb // Frame Buffer graphics - no X11 or Wayland
	 <machine name>有如下選擇
	  imx6qpsabreauto•imx6qpsabresd•imx6ulevk•imx6ull14x14evk•imx6ull9x9evk•imx6dlsabreauto• 
	  imx6dlsabresd•imx6qsabreauto•imx6qsabresd•imx6slevk•imx6solosabreauto•imx6solosabresd•  
	  imx6sxsabresd•imx6sxsabreauto•imx6sllevk•imx7dsabresd•imx8qmlpddr4arm2•imx8mq_evk•  
	  imx8qxplpddr4arm2• imx7ulpevk

	根據需要選擇fsl-imx-x11和imx8mq_evk
	$ DISTRO=fsl-imx-x11  MACHINE=imx8mq_evk source fsl-setup-release.sh -b <build dir>
	不同發行版本的配置資訊在meta-fsl-bsp-release/imx/meta-sdk/conf/distro中可以檢視
	以fsl-imx-x11.conf為例,其内容為
	# i.MX DISTRO for X11 with no wayland

	include conf/distro/include/fsl-imx-base.inc
	include conf/distro/include/fsl-imx-preferred-env.inc

	DISTRO = "fsl-imx-x11"

	# Remove conflicting backends.
	DISTRO_FEATURES_remove = "wayland"

	# These are X11 specific
	DISTRO_FEATURES_append = " x11"                    
	同樣在meta-fsl-bsp-release/imx/meta-bsp/conf/machine下可以看到machine的配置資訊   


	-b <build dir>  指定由fsl-setup-release.sh腳本建立的生成目錄的名稱 本例設為build    
	最終執行指令為    
	$ DISTRO=fsl-imx-x11  MACHINE=imx8mq_evk source fsl-setup-release.sh -b build dir10
	
2.接受EULA協定
	當腳本運作時,它會提示使用者接受 EULA。 接受 EULA 後,接受将存儲在每個建構檔案夾内的 
	local.conf 中,并且不再顯示該建構檔案夾的 EULA 接受查詢。
	
	當腳本執行完畢後,會在生成
	# build/conf/bblayers.conf local.conf 
	
	其中bblayers.conf包含了 Yocto項目版本中使用的所有層(metalayer)
	local.conf中記錄了machine和distro資訊,如果需要可以編輯此文本來修改machine資訊
	
3.選擇 i.MX Yocto 項目映像
	可供選擇的鏡像包括:
	core-image-minimal
    core-image-base
    core-image-sato
    fsl-image-machine-test
    fsl-image-gui
    fsl-image-qt5

4.1使用bitbake指令建構鏡像
	本例選擇 core-image-minimal
	故指令為 $bitbake core-image-minimal
	bitbake的詳細教程可以參考《BitBake User Manual》
	
	編譯時間較長,如果編譯過程中無意關掉了終端,那麼重新打開終端進入fsl-release-bsp目錄
	後隻需要執行以下指令就可以重新進入編譯環境:
       $ source setup-environment build
	
4.2編譯交叉工具鍊:
		bitbake meta-toolchain
	編譯完成後會在/opt/yocto/fsl-release-bsp/build/tmp/deploy/sdk目錄下生成檔案
5.u-boot的配置
	U-Boot 配置在主機配置檔案中定義。 配置是通過使用 UBOOT_CONFIG 設定來指定的。
	 這需要在 local.conf 中設定 UBOOT_CONFIG。 否則,U-Boot 建構預設使用 SDboot

6.鏡像部署
	建構完成後,建立的鏡像位于 <build directory>/tmp/deploy/images。 大多數情況下,
	映像特定于環境設定中的機器設定。 每個鏡像建構都會根據機器配置檔案中定義的 IMAGE_FSTYPES
	建立
		一個 U-Boot、一個核心和一個鏡像類型。
	大多數機器配置提供一個 SD 卡映像 (.sdcard)、一個 ext3 和 tar.bz2。 ext3 隻是根檔案系統。
	.sdcard 映像包含 U-Boot、核心和 rootfs 完全設定為在 SD 卡上使用

7.燒錄到sd卡
	在imx-yocto-bsp/build/tmp/deploy/images目錄下生成的imx8mqevk中包含 .sdcard 映像将其解壓後
	燒錄到sd卡中
	$ sudo dd if=<image name>.sdcard  of=/dev/sd<partition> bs=1M && sync

	使用fdisk -l 檢視sd卡的<partition> 最終指令為

	$ sudo dd if=core-image-minimal-imx8mqevk-20210812023532.rootfs.sdcard 
	 of=/dev/sdb bs=1M && sync
	 
8.設定開發闆從sd啟動
	将撥碼開關調成Table 7.Booting from TF on i.MX 8MQuad EVK所示,插入TF卡,連接配接開發闆,
           
總結與不足感悟

注意:當運作bitbake 是若顯示 command not found 在poky目錄下運作oe-init-build-env後即可使用bitbake指令

————————————————————————————————————————————

使用者态控制GPIO點亮開發闆LED

通過開發闆電路圖查找LED對應的GPIO,對應位PWM_LED,繼續查找PWM_LED

總結與不足感悟

PWM_LED對應GPIO1_IO13

總結與不足感悟

GPIO序号計算

Led對應的GPIO為GPIO1_IO13,連接配接開發闆後在/sys/class/gpio目錄下可以看到每組GPIO增加32

故GPIO1_IO13對應需要為:

(n-1)*32 + i
			n和i分别對應GPIO1_IO13中的1和13 故其序号為13
           

GPIO點亮LED

1.将标号13的GPIO導入到檔案系統,在該路徑下使用以下指令,在該目錄下會生成gpio13目錄

echo 13> export
	實際使用時,GPIO13被核心占用作為電源訓示燈,echo 13 > export會失敗,需要修改核心源碼解除其
	對GPIO1_13的使用後(這部分内容仍需學習),echo 13 > export才會成功
           
總結與不足感悟

2.控制GPIO為輸出

echo out > direction
           

3.控制高低電平

echo 1 > value
           

以上通過使用者态控制GPIO實作點亮LED

彙編點亮LED

  1. 使能GPIO1_13對應的時鐘 查找發現其對應的GPIO時鐘為CCGR11
    總結與不足感悟
  2. 計算CCGR11位址

    根據計算公式CCGR的位址為

3038_0000 + 4000 + (10 × 11)  = 3038_40B0
将16轉為十六進制計算
           
總結與不足感悟

為友善 将其32位全部置為1

ldr r0,=0x3038_40B0
ldr r1,=0xffffffff
str r1,[r0]
           
  1. 設定引腳複用為GPIO

    找到GPIO1_IO13複用對應位址為0x3033_005C,

    總結與不足感悟
    并将其設定為普通IO
    總結與不足感悟
ldr r0,=0x3033_005C
ldr r1,=0x0
srt r1,[r0]
           
  1. 設定引腳屬性
    總結與不足感悟
    預設設定為0x10b0
ldr r0,=0x3033_02C4
ldr r1=0x10b0
str r1,[r0]

           
  1. 控制GPIO引腳為輸出模式

    當IOMUXC 處于GPIO 模式時,GPIO_GDIR 用作方向控制。 每個位指定一位信号的方向。 每個 DIR 位到相應 SoC 信号的映射由 SoC 的引腳配置設定和 IOMUX 表決定

    總結與不足感悟

    對應位設為0表示輸入,設為1表示輸出,及将其第13位設定為1

    GPIO_DIR對應位置為基位址GIPIO1的位址+4的偏移

    GIPIO1的位址為0x3020_0000

ldr r0,=0x3020_0004
ldr r1,=8192
str r1,[r0]
           
  1. 控制GPIO引腳輸出1

    如果 IOMUXC 處于 GPIO 模式并且設定了給定的 GPIO 方向位,則相應的 DR 位被驅動到輸出。 如果給定的 GPIO 方向位被清零,則 GPIO_DR 的讀取反映了相應信号的值

    總結與不足感悟
    将GPIO13輸出為低電平
ldr r0,=0x3020_0000 
ldr r1,=0
str r1,[r0] 
           
  1. 後續問題

    将寫好的彙編檔案通過交叉編譯得到二進制檔案,但其不能在開發闆上運作,缺少了啟動相關資訊。為二進制檔案添加頭部資訊需要在後續學習補充

Makefile

通過C語言來點亮LED(通過在使用者态控制GPIO13)

GPIO13_DRICTION位址和GPIO13_VALUE位址如下

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#define GPIO13_DRICTION "/sys/devices/platform/30200000.gpio/gpiochip0/gpio/gpio13/direction"
#define GPIO13_VALUE "/sys/devices/platform/30200000.gpio/gpiochip0/gpio/gpio13/value" 

int main(){
        FILE*dri,*value;
        printf("this is led swap \r\n");
        dri = fopen(GPIO13_DRICTION,"w");
        value = fopen(GPIO13_VALUE,"w");
        if(dri<0||value<0){
                printf("faile  to open\r\n");
                exit(1);
        }
        fwrite("out",3,1,dri);
        fflush(dri);
        while(1){
                fwrite("1",1,1,value);
                fflush(value);
                printf("on\r\n");
                sleep(1);
                fwrite("0",1,1,value);
                fflush(value);
                printf("off\r\n");
                sleep(1);
        }
        return 0;
}
           

通過交叉編譯得到可執行檔案,通過U盤拷貝到開發闆後執行,可以實作LED閃爍

注意:U盤需要為FAT32格式

編寫Makefile

将實作閃爍功能的led.c檔案放在module1目錄下,主函數main.c檔案放在module2目錄下,頭檔案led.h放在include目錄下

總結與不足感悟

main.c函數

#include<stdio.h>
#include "led.h"
#include<stdlib.h>
#include<unistd.h>
FILE*value;
FILE*dir;
int main(){

        value =  fopen(GPIO13_VALUE,"w");
        dir = fopen(GPIO13_DRICTION,"w");
        if(value<0||dir<0){
                printf("open fail\r\n");
                return 0;
        }
        fwrite("out",3,1,dir);
        fflush(dir);
        while(1){
                on();
                fflush(value);
                sleep(1);
                off();
                fflush(value);
        }

        printf("ok\r\n");
        return 0;
}

           

Makefile

ARCH ?= x86

ifeq ($(ARCH),x86)
                CC=gcc
else
                CC=aarch64-linux-gnu-gcc  #arm平台下使用aarch64-linux-gnu-gcc
endif

TARGET=led  #生成目标
#OBJS=main.o mp3.o
BUILD_DIR=build  #生成目錄
SRC_DIR=module1 module2  #源路徑
INC_DIR=include #頭檔案路徑
CFLAGS=$(patsubst %,-I%,$(INC_DIR)) #連結
INCLUDES=$(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h)) #include下所有的頭檔案

SOURCES=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))  #所有的.c檔案
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES))) #根據.c檔案對應的.o目标檔案
VPATH=$(SRC_DIR) #搜尋路徑

$(BUILD_DIR)/$(TARGET):$(OBJS) #終極目标 在目錄下生成目标 依賴于objs
                $(CC) $^ -o $@


$(BUILD_DIR)/%.o:%.c $(INCLUDES) | create_build
                $(CC) -c $< -o $@ $(CFLAGS)




.PHONY:clean create_build  #僞目标

clean:
        rm -r $(BUILD_DIR)

create_build:
        mkdir -p $(BUILD_DIR)

           

執行 make ARCH=arm 指令 最終生成

總結與不足感悟

make clean 删除build檔案

感悟

入職至今,不覺中已有一月有餘,感觸頗深。入職前站在公司門口,對裡面的一切充滿了好奇與期望,很幸運,這裡有着和諧的工作氛圍、熱情友善的同僚以及耐心認真的導師,在大家的幫助下,我從剛進公司時的無知,漸漸地熟悉了這個全新的氛圍,并深刻的體會到學習的重要性。

一、學習要有針對性

從學校到公司,一起都是陌生而又嶄新的。新入職的一個月主要以學習和教育訓練為主,公司的教育訓練讓我對公司的業務、發展有了全面的認識,同時對自己的職業發展有了更明确的規劃;自我學習過程中,看着幾千頁的英文手冊,也曾感到迷惘與失落,好在導師同僚及時的指導讓我明白了學習要有針對性和目的性,和以往學習過的内容相比,工作中更多的内容需要重新學習,在學習過程中不應有畏難情緒,要針對工作内容選擇性和針對性的學習。“吾生也有涯,而知也無涯”,知識是無窮盡的,隻有明确了自己的目标與方向,将工作與學習結合起來,才能在有限的時間中更高效的學習、更高效的工作。

二、學習要主動,不懂就要問

學習過程中有很多問題一時半會查不到,剛入職時,因為與同僚導師還不是很熟悉,難免有些不好意思開口,時間一久,問題便落下了。後面在相處的過程中,導師同僚的熱情友善打消了我的顧慮,遇到困難時他們總會不厭其煩的給我講解分析,并讓我不要難為情,學習要主動,有了不懂就要問。

三、學習是為了自己

學習不是為了他人而學,最終受益的是自己,是以要多學習,公司為我們提供了良好的學習環境和完善的培養計劃,就應該積極主動的抓住這些機會,将自身所學和公司所需結合起來,實作自己和公司的雙赢發展,在實作自身價值的同時,為公司獻上一份力,學習是為了更好的工作,工作也是在不斷的學習!

以上是我一個多月來的總結,工作中還有很多的不足,煩請大家多多指教!