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 这三个文件拷贝到工程中。

一、程序的编写

  1. 创建 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
    
    
    
    
    
  2. 新建 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;
    }
    
  3. 创建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软件

    将imxdownload软件复制到工程文件夹下,给予权限,

    chmod 777 imxdownload

    /imxdownload ledc.bin /dev/sdb //下载到 SD 卡中, 不能烧写到/dev/sda 或 sda1 设备里面!

    将SD卡插到开发板上,开发板上的DS0会每个500ms闪烁一次。

以上是关于I.MX6ULL 官方SDK移植的主要内容,如果未能解决你的问题,请参考以下文章

I.MX6ULL 官方SDK移植

i.MX6ULL系统移植 | 移植NXP官方 linux 5.4 内核

i.MX6ULL系统移植 | 移植NXP官方 linux 5.4 内核

ARM(IMX6U)裸机官方SDK移植

移植linux内核到i.MX6ULL过程

移植linux内核到i.MX6ULL过程