i.MX6ULL裸机开发 二:官方 SDK移植

一、I.MX6ULL 官方 SDK包下载

i.MX6ULL裸机开发 二:官方 SDK移植_第1张图片

二、I.MX6ULL 官方 SDK包简介

NXP 针对 I.MX6ULL 编写了一个 SDK 包,这个 SDK 包就类似于 STM32STD 库或者 HAL 库,这个 SDK 包提供了 WindowsLinux 两种版本,分别针对主机系统是 WindowsLinux

我们不是通过 SDK 进行开发,而是需要 SDK 中寄存器相关定义文件。一共需要如下三个文件:

  • fsl_common.h:位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h
  • fsl_iomuxc.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h
  • MCIMX6Y2.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h

1、fsl_common.h 内容

  • 构造代码状态
    • MAKE_STATUS
    • enum _status_groups
    • enum _generic_status
  • 版本号
  • Debug 控制台类型
  • status_t 类型(typedef int32_t status_t
  • 一些宏定义
  • 不同链接器相关定义
  • 对 C++ 的一些支持(__cplusplus

2、fsl_iomuxc.h 内容

  • IOMUXC 复用定义
  • 引脚复用功能函数(IOMUXC_SetPinMux
  • 引脚配置函数(IOMUXC_SetPinConfig

3、MCIMX6Y2.h 内容

  • IRQn_Type 定义
  • SW_MUX_CTL_PAD 引脚枚举
  • SW_PAD_CTL_PAD_DDR 引脚枚举
  • SW_PAD_CTL_PAD 引脚枚举
  • IOMUXC 输入选择
  • IOMUXC 组枚举
  • IOMUXC_SNVS SW_MUX_CTL_PAD 枚举
  • IOMUXC_SNVS SW_PAD_CTL_PAD 枚举
  • 外设地址定义
  • 外设结构体定义
  • 外设的基本操作

三、SDK 移植

1、fsl_common.h 需要内容(删除宏、编译器相关内容、C++相关内容)

  • 构造代码状态
    • MAKE_STATUS
    • enum _status_groups
    • enum _generic_status
  • 版本号
  • Debug 控制台类型
  • status_t 类型(typedef int32_t status_t

2、fsl_iomuxc.h 内容都需要,删除包含头文件即可。

3、MCIMX6Y2.h 内容都需要,删除包含头文件即可。

4、对以上头文件使用的数据类型添加(移植官方文件也可以(SDK 中未找到),自己写以可以)。

四、编写代码

1、fsl_commom.h

文件较大,不复制相关代码。

2、fsl_iomuxc.h

文件较大,不复制相关代码。

3、MCIMX6Y2.h

文件较大,不复制相关代码。

4、types.h

定义 fsl_commom.hfsl_iomuxc.hMCIMX6Y2.h 文件中相关数据类型

#ifndef __TYPES_H__
#define __TYPES_H__

#define __I     volatile
#define __O     volatile
#define __IO    volatile

typedef signed char     int8_t;
typedef signed short    int16_t;
typedef signed int      int32_t;
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;

#endif

5、main.c

#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"

/*
 *  使能 I.MX6U 所有外设时钟
 */
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;
}

void led_init(void)
{
    /* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);
    /* 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);
}

/*
 *  打开 LED 灯
 */
void led_on(void)
{
    GPIO1->DR &= ~(1<<3);
}

/*
 *  关闭 LED 灯
 */
void led_off(void)
{
    GPIO1->DR |= (1<<3);
}

void delay_short(volatile unsigned int n)
{
    while(n--){}
}

void delay(volatile unsigned int n)
{
    while(n--){
        delay_short(0x7ff);
    }
}

int main(void)
{
    clk_enable();
    led_init();
    while(1){
        led_off();
        delay(500);

        led_on();
        delay(500);
    }
    return 0;
}

6、start.s

.global __start /* 全局标号 */

/*
 * 描述: _start 函数,程序从此函数开始执行,此函数主要功能是设置 C 运行环境。
 * 注:I.MX6U 内部的 Boot ROM 会读取 DCD 数据中的 DDR 配置参数然后完成 DDR 初始化。
 */
__start:
    /* 设置处理器进入 SVC 模式 */
    mrs r0, cpsr        /* 将 r0 的低 5 位清零,也就是 cpsr 的 M0~M4 */
    bic r0, r0, #0x1f   /* r0或上 0x13,表示使用 SVC 模式 */
    orr r0, r0, #0x13   /* 将 r0 的数据写入到 cpsr_c 中 */
    msr cpsr, r0

    ldr sp, =0X80200000 /* 设置栈指针 */
    b main              /* 跳转到 main 函数 */

7、imx6ul.lds

SECTIONS{
    . = 0X87800000;     /* 设置定位计数器(链接起始地址) */
    .text :
    {
        start.o         /* 开始位置的文件为start.o, start.o 里面包含着第一个要执行的指令 */
        main.o          /*  */
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4) : { *(.data) }
    __bss_start = .;    /* '.' 为定位符, __bss_start 标志方便对 .bss 段清零 */
    .bss ALIGN(4) : { *(.bss) *(COMMON) }
    __bss_end = .;
}

8、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) -T imx6ul.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 $@ $<

clean:
	rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis

五、验证

onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$ ls -l
total 3540
-rw-rw-r-- 1 onlylove onlylove    7663 Dec  7 04:01 fsl_common.h
-rw-rw-r-- 1 onlylove onlylove  116683 Dec  7 04:00 fsl_iomuxc.h
-rw-rw-r-- 1 onlylove onlylove     492 Dec  7 04:09 imx6ul.lds
-rwxrwxr-x 1 onlylove onlylove   13488 Dec  7 04:14 imxdownload
-rw-rw-r-- 1 onlylove onlylove    3569 Dec  7 04:33 load.imx
-rw-rw-r-- 1 onlylove onlylove    1516 Dec  7 04:08 main.c
-rw-rw-r-- 1 onlylove onlylove     555 Dec  7 04:18 Makefile
-rw-rw-r-- 1 onlylove onlylove 3454572 Dec  7 03:57 MCIMX6Y2.h
-rw-rw-r-- 1 onlylove onlylove     648 Dec  7 04:14 start.s
-rw-rw-r-- 1 onlylove onlylove     324 Dec  7 04:01 types.h
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$ make
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o main.o main.c
arm-linux-gnueabihf-ld -T imx6ul.lds -o ledc.elf start.o main.o
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$ ls -l
total 3568
-rw-rw-r-- 1 onlylove onlylove    7663 Dec  7 04:01 fsl_common.h
-rw-rw-r-- 1 onlylove onlylove  116683 Dec  7 04:00 fsl_iomuxc.h
-rw-rw-r-- 1 onlylove onlylove     492 Dec  7 04:09 imx6ul.lds
-rwxrwxr-x 1 onlylove onlylove   13488 Dec  7 04:14 imxdownload
-rwxrwxr-x 1 onlylove onlylove     497 Dec  7 04:34 ledc.bin
-rw-rw-r-- 1 onlylove onlylove    7290 Dec  7 04:34 ledc.dis
-rwxrwxr-x 1 onlylove onlylove   66797 Dec  7 04:34 ledc.elf
-rw-rw-r-- 1 onlylove onlylove    3569 Dec  7 04:33 load.imx
-rw-rw-r-- 1 onlylove onlylove    1516 Dec  7 04:08 main.c
-rw-rw-r-- 1 onlylove onlylove    1381 Dec  7 04:34 main.o
-rw-rw-r-- 1 onlylove onlylove     555 Dec  7 04:18 Makefile
-rw-rw-r-- 1 onlylove onlylove 3454572 Dec  7 03:57 MCIMX6Y2.h
-rw-rw-r-- 1 onlylove onlylove     708 Dec  7 04:34 start.o
-rw-rw-r-- 1 onlylove onlylove     648 Dec  7 04:14 start.s
-rw-rw-r-- 1 onlylove onlylove     324 Dec  7 04:01 types.h
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$

你可能感兴趣的:(i.MX6ULL,i.MX6ULL)