imx6ull基于yocto工程的l汇编点亮ed

通过汇编点亮led

在裸机状态下通过汇编点亮led,即没有操作系统,(uboot kernel rootfs 都不需要实现)。

led点亮原理

1.GPIO复用

根据原理图,找到led对应的引脚(pin),复用为GPIO(只有GPIO才能控制输入输出)
芯片手册查询寄存器的方法,以CSI_HSYNC为例,在IOMUXC章节搜索CSI_HSYNC 找到

在这里插入图片描述
关键字是MUX意为复用,20E_01E0为该寄存器的地址,根据手册将其复用为GPIO
imx6ull基于yocto工程的l汇编点亮ed_第1张图片
即将该寄存器的值设置为0b101

2. PAD属性

引脚的电气属性配置,如驱动能力、上拉/下拉选择等,占时不太清楚,按要求设置

3.GPIO.GDIR

控制GPIO为输入还是输出。芯片手册查询方法
imx6ull基于yocto工程的l汇编点亮ed_第2张图片
在GPIO章节,找到GPIO memory map 中的GPIOx_GDIR,如想将GPIO4_IO20设置为输出
那么就需要找到GPIO4_GDIR的寄存器,然后将该寄存器的第20位设置位1

4.GPIO.DR

控制输出高低电平,芯片手册查询方法同上,找到GPIOx_DR,设置对应的寄存器

yocto编译led.bin

在yocto工程中创建recipes,结构如下
imx6ull基于yocto工程的l汇编点亮ed_第3张图片
led.s和Makefile不多解释,led.bb如下

SUMMARY = " led test "
DESCRIPTION = " my led "
LICENSE = "CLOSED"

FILESEXTRAPATHS_prepend := "${THISDIR}/:"

#设置源码路径,在bitbake在执行时会从当前路径的led目录中获取源码,目录名最好与bb文件名称相同
SRC_URI = "file://led/"

#设定工作路径 编译时会将SRC_URI 下的文件unpack到S路径下
S = "${WORKDIR}/led"


# 为了确保我们使用的是交叉编译器
DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}binutils"

EXTRA_OEMAKE = "'CROSS_COMPILE=${TARGET_PREFIX}'"


# 添加任务来编译汇编文件
do_compile() {
#相当于在 S = "${WORKDIR}/led" 下执行make ,前面 EXTRA_OEMAKE 设定了交叉编译工具
	oe_runmake
}

使用bitbake -c compile -f led 即可编译得到led.bin

烧录

直接将led.bin 烧录到sd卡是肯定不能执行的,因为做的是裸机使用,从sd卡启动时,片内的rom代码是无法直接将led.bin 加载到内存运行的,必须在led.bin 前面加上一段配置代码,后面学到了继续分析。

你可能感兴趣的:(arm开发)