在裸机状态下通过汇编点亮led,即没有操作系统,(uboot kernel rootfs 都不需要实现)。
根据原理图,找到led对应的引脚(pin),复用为GPIO(只有GPIO才能控制输入输出)
芯片手册查询寄存器的方法,以CSI_HSYNC为例,在IOMUXC章节搜索CSI_HSYNC 找到
关键字是MUX意为复用,20E_01E0为该寄存器的地址,根据手册将其复用为GPIO
即将该寄存器的值设置为0b101
引脚的电气属性配置,如驱动能力、上拉/下拉选择等,占时不太清楚,按要求设置
控制GPIO为输入还是输出。芯片手册查询方法
在GPIO章节,找到GPIO memory map 中的GPIOx_GDIR,如想将GPIO4_IO20设置为输出
那么就需要找到GPIO4_GDIR的寄存器,然后将该寄存器的第20位设置位1
控制输出高低电平,芯片手册查询方法同上,找到GPIOx_DR,设置对应的寄存器
在yocto工程中创建recipes,结构如下
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 前面加上一段配置代码,后面学到了继续分析。