嵌入式Linux之LED驱动

各版本LED驱动的区别与联系

    • 汇编 LED
    • C语言 LED
    • 仿STM32 LED
    • 官方SDK LED
    • BSP工程管理 LED

本文相关资源:
1、 汇编 C语言 仿STM32 官方SDK BSP工程管理)LED驱动
2、 SDK_2.2_MCIM6ULL_RFP_Win.exe
注:LED驱动里的汇编文件没有改写不能用于uboot启动.bin文件,若想采用uboot启动请参考 嵌入式Linux之教你怎么使用uboot利用四个字母启动裸机程序

汇编 LED

前文介绍过了这里就不多介绍了,详见文章嵌入式Linux之汇编LED
在这里贴出来纯属是因为它也是编写LED驱动的一种,由于除了这个之外,其他的都是由C编写的,所以其他做比较的时候并不包含汇编LED

C语言 LED

这是这四个里面编写最简单的,可以说这是其他三个的核心代码,因为其他的都是在这个基础上的一个进一步的封装。
部分代码介绍
main.h

#define CCM_CCGR0 			*((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 			*((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 			*((volatile unsigned int *)0X020C4070)

main.c

	CCM_CCGR0 = 0xffffffff;
	CCM_CCGR1 = 0xffffffff;
	CCM_CCGR2 = 0xffffffff;

这是工程的部分代码,简单来说就是直接对CCGR各个寄存器的地址直接操作

仿STM32 LED

仿STM32顾名思义就是仿照了STM32对寄存器的操作方式——结构体,它简化了输入每个寄存器的麻烦,利用了结构体的特性而只用输入一组连续的寄存器的首地址即可
下面列出了imx6ul.h的GPIO部分代码


/* 
 * 外设寄存器组的基地址 
 */
#define GPIO1_BASE                  (0x0209C000)
#define GPIO2_BASE                  (0x020A0000)
#define GPIO3_BASE                  (0x020A4000)
#define GPIO4_BASE                  (0x020A8000)
#define GPIO5_BASE                  (0x020AC000)
/* 
 * GPIO寄存器结构体
 */
typedef struct 
{
	volatile unsigned int DR;							
	volatile unsigned int GDIR; 							
	volatile unsigned int PSR;								
	volatile unsigned int ICR1; 							
	volatile unsigned int ICR2; 							 
	volatile unsigned int IMR;								 
	volatile unsigned int ISR;			
	volatile unsigned int EDGE_SEL;  
}GPIO_Type;

/* 
 * 外设指针 
 */
#define GPIO1				((GPIO_Type *)GPIO1_BASE)
#define GPIO2				((GPIO_Type *)GPIO2_BASE)
#define GPIO3				((GPIO_Type *)GPIO3_BASE)
#define GPIO4				((GPIO_Type *)GPIO4_BASE)
#define GPIO5				((GPIO_Type *)GPIO5_BASE)

这是对LED初始化的部分

/* 3、初始化GPIO */
GPIO1->GDIR = 0X0000008;	/* GPIO1_IO03设置为输出 */

/* 4、设置GPIO1_IO03输出低电平,打开LED0 */	
GPIO1->DR &= ~(1 << 3);	

有上可以看出操作方式基本上与STM32大同小异。

官方SDK LED

使用官方SDK的原因,仿STM32的外设结构体都是自己手动输入的,6ull的外设很多,自己手动输入不太现实,这个SDK包中提供了文件,对所有外设的结构体的定义
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;

SDK包里面会用到很多数据类型,所以我们需要在cc.h里面定义一些常用的数据类型。
我们使用的是在SDK包里derices目录下的MCIMX6Y2,(这个依照具体的芯片所定)
fsl_iomuxc.h包含了众多io口的配置

BSP工程管理 LED

BSP工程管理的目的就是为了模块化整理代码,同一个属性的文件存放在同一个目录里面。为了后面编写更大的工程打下基础
1、新建所需的文件夹,将同一属性的文件放到相应的文件夹中。
2、修改clk、led、delay驱动,创建对应的驱动文件,然后放置到对应的目录中。
3、根据编写的新驱动文件,修改main.c文件内容。

你可能感兴趣的:(Linux)