I.MX6ULL 官方SDK移植
Posted 等不到星光等时光呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I.MX6ULL 官方SDK移植相关的知识,希望对你有一定的参考价值。
I.MX6ULL 官方SDK移植
NXP 针对 I.MX6ULL 编写了一个 SDK 包,这个 SDK 包就类似于 STM32 的 STD 库或者HAL 库,这个 SDK 包提供了 Windows 和 Linux 两种版本,分别针对主机系统是 Windows 和Linux。
将正点原子修改后的 fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这三个文件拷贝到工程中。
一、程序的编写
-
创建 cc.h 文件
cc.h 里面存放一些 SDK 库文件需要使用到的数据类型,在cc.h 里面输入如下代码:
#ifndef __CC_H #define __CC_H /* * 自定义一些数据类型供库文件使用 */ #define __I volatile #define __O volatile #define __IO volatile typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; typedef signed char s8; typedef signed short int s16; typedef signed int s32; typedef signed long long int s64; typedef unsigned char u8; typedef unsigned short int u16; typedef unsigned int u32; typedef unsigned long long int u64; #endif
-
新建 start.S 和 main.c 这两个文件
start.S写入如下代码:
.global _start /* 全局标号 */ /* * 描述: _start函数,程序从此函数开始执行,此函数主要功能是设置C * 运行环境。 */ _start: /* 进入SVC模式 */ mrs r0, cpsr bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */ orr r0, r0, #0x13 /* r0或上0x13,表示使用SVC模式 */ msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */ ldr sp,=0X80200000 /* 设置栈指针 */ b main /* 跳转到main函数 */
main.c写入如下代码:
#include "fsl_common.h" #include "fsl_iomuxc.h" #include "MCIMX6Y2.h" /* * @description : 使能I.MX6U所有外设时钟 * @param : 无 * @return : 无 */ void clk_enable(void) CCM->CCGR0 = 0XFFFFFFFF; CCM->CCGR1 = 0XFFFFFFFF; CCM->CCGR2 = 0XFFFFFFFF; CCM->CCGR3 = 0XFFFFFFFF; CCM->CCGR4 = 0XFFFFFFFF; CCM->CCGR5 = 0XFFFFFFFF; CCM->CCGR6 = 0XFFFFFFFF; /* * @description : 初始化LED对应的GPIO * @param : 无 * @return : 无 */ void led_init(void) /* 1、初始化IO复用 */ IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0); /* 复用为GPIO1_IO0 */ /* 2、、配置GPIO1_IO03的IO属性 *bit 16:0 HYS关闭 *bit [15:14]: 00 默认下拉 *bit [13]: 0 kepper功能 *bit [12]: 1 pull/keeper使能 *bit [11]: 0 关闭开路输出 *bit [7:6]: 10 速度100Mhz *bit [5:3]: 110 R0/6驱动能力 *bit [0]: 0 低转换率 */ IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0); /* 3、初始化GPIO,设置GPIO1_IO03设置为输出 */ GPIO1->GDIR |= (1 << 3); /* 4、设置GPIO1_IO03输出低电平,打开LED0 */ GPIO1->DR &= ~(1 << 3); /* * @description : 打开LED灯 * @param : 无 * @return : 无 */ void led_on(void) /* 将GPIO1_DR的bit3清零 */ GPIO1->DR &= ~(1<<3); /* * @description : 关闭LED灯 * @param : 无 * @return : 无 */ void led_off(void) /* 将GPIO1_DR的bit3置1 */ GPIO1->DR |= (1<<3); /* * @description : 短时间延时函数 * @param - n : 要延时循环次数(空操作循环次数,模式延时) * @return : 无 */ void delay_short(volatile unsigned int n) while(n--) /* * @description : 延时函数,在396Mhz的主频下 * 延时时间大约为1ms * @param - n : 要延时的ms数 * @return : 无 */ void delay(volatile unsigned int n) while(n--) delay_short(0x7ff); /* * @description : mian函数 * @param : 无 * @return : 无 */ int main(void) clk_enable(); /* 使能所有的时钟 */ led_init(); /* 初始化led */ while(1) /* 死循环 */ led_off(); /* 关闭LED */ delay(500); /* 延时500ms */ led_on(); /* 打开LED */ delay(500); /* 延时500ms */ return 0;
-
创建Makefile文件
在Makefile文件中写入如下代码:
CROSS_COMPILE ?= arm-linux-gnueabihf- NAME ?= ledc CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdump OBJS := start.o main.o $(NAME).bin:$(OBJS) $(LD) -Timx6ul.lds -o $(NAME).elf $^ $(OBJCOPY) -O binary -S $(NAME).elf $@ $(OBJDUMP) -D -m arm $(NAME).elf > $(NAME).dis %.o:%.s $(CC) -Wall -nostdlib -c -O2 -o $@ $< %.o:%.S $(CC) -Wall -nostdlib -c -O2 -o $@ $< %.o:%.c $(CC) -Wall -nostdlib -c -O2 -o $@ $<
在创建一个imx6ul.lds文件,写入如下内容:
SECTIONS . = 0X87800000; .text : start.o main.o *(.text) .rodata ALIGN(4) : *(.rodata*) .data ALIGN(4) : *(.data) __bss_start = .; .bss ALIGN(4) : *(.bss) *(COMMON) __bss_end = .;
将imxdownload软件复制到工程文件夹下,给予权限,
chmod 777 imxdownload
/imxdownload ledc.bin /dev/sdb
//下载到 SD 卡中, 不能烧写到/dev/sda 或 sda1 设备里面!将SD卡插到开发板上,开发板上的DS0会每个500ms闪烁一次。
以上是关于I.MX6ULL 官方SDK移植的主要内容,如果未能解决你的问题,请参考以下文章
i.MX6ULL系统移植 | 移植NXP官方 linux 5.4 内核