https://blog.csdn.net/yangzheng_yz/article/details/52817670
Author:杨正date:2016.9.21
目的
在u-boot中添加驱动程序。
详细举例介绍
在uboot中操作寄存器,实现对gpio及外围设备的控制有两种方法,一种是直接在arch/arm/lib/board.c中添加对寄存器的操作代码,如:
-
#define muxctrl_reg5 0x200f0014 -
#define GPIO6_DIR 0x201a0400 -
#define GPIO6_1_DATA 0x201a0008 -
#define GPIO6_1 (1 << 1) -
#define readl(addr) (*(volatile unsigned int*)(addr)) -
#define writel(val, addr) ((*(volatile unsigned int *) (addr)) = (val)) -
int clear_irled(void) -
{ -
unsigned int reg_val; -
reg_val = writel(0, muxctrl_reg5); // set gpio mode -
reg_val = readl(GPIO6_DIR); -
reg_val |= GPIO6_1; -
writel(reg_val, GPIO6_DIR); -
reg_val = readl(GPIO6_1_DATA); -
reg_val &= ~GPIO6_1; -
writel(reg_val, GPIO6_1_DATA); -
return 0; -
} -
void start_armboot (void) -
{ -
init_fnc_t **init_fnc_ptr; -
char *s; -
#ifdef CONFIG_HAS_SLAVE -
char *e; -
#endif -
#if defined(CONFIG_VFD) || defined(CONFIG_LCD) -
unsigned long addr; -
#endif -
#ifdef CONFIG_HI3516A // defined in the include/configs/hi3516a.h -
clear_irled(); // clear ir led, add by yangzheng 2016.9.21 -
#endif
另一种方法:
1、在driver/下新建hi_gpio目录,如:
[yangzheng@centos6 hi_gpio]$ ls
hi_gpio.c Makefile
hi_gpio.c内容如下:
-
[yangzheng@centos6 hi_gpio]$ cat hi_gpio.c -
/********************************************************************************* -
* Copyright: (C) 2016 Yang Zheng -
* All rights reserved. -
* -
* Filename: hi_gpio.c -
* Description: This file -
* -
* Version: 1.0.0(09/21/2016~) -
* Author: Yang Zheng -
* ChangeLog: 1, Release initial version on "09/21/2016 05:41:41 PM" -
* -
********************************************************************************/ -
#include -
#define readl(addr) (*(volatile unsigned int *) (addr)) -
#define writel(val, addr) (*(volatile unsigned int *) (addr) = (val)) -
#define muxctrl_reg5 0x200f0014 -
#define GPIO6_DIR 0x201a0400 -
#define GPIO6_1_DATA 0x201a0008 -
#define GPIO6_1 1 << 1 -
#define REG_SET 1 -
#define REG_CLR 0 -
#ifdef DEBUG -
#define DPRINTF(args...) printf(args) -
#else -
#define DPRINTF(args...) -
#endif -
int clear_irled(void) -
{ -
unsigned int reg_val; -
reg_val = writel(REG_CLR, muxctrl_reg5); // set gpio mode -
reg_val = readl(GPIO6_DIR); -
reg_val |= GPIO6_1; -
writel(reg_val, GPIO6_DIR); -
writel(REG_CLR, GPIO6_1_DATA); -
DPRINTF("clear ir led...\n"); -
return 0; -
}
Makefile如下(可以拷贝driver目录下的各模块模板):
-
[yangzheng@centos6 hi_gpio]$ cat Makefile -
# -
# Copyright 2000-2008 -
# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -
# -
# See file CREDITS for list of people who contributed to this -
# project. -
# -
# This program is free software; you can redistribute it and/or -
# modify it under the terms of the GNU General Public License as -
# published by the Free Software Foundation; either version 2 of -
# the License, or (at your option) any later version. -
# -
# This program is distributed in the hope that it will be useful, -
# but WITHOUT ANY WARRANTY; without even the implied warranty of -
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -
# GNU General Public License for more details. -
# -
# You should have received a copy of the GNU General Public License -
# along with this program; if not, write to the Free Software -
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -
# MA 02111-1307 USA -
# -
include $(TOPDIR)/config.mk -
LIB := $(obj)libhi_gpio.a -
COBJS-$(CONFIG_HI3516A_GPIO) += hi_gpio.o -
COBJS := $(COBJS-y) -
SRCS := $(COBJS:.o=.c) -
OBJS := $(addprefix $(obj),$(COBJS)) -
all: $(LIB) -
$(LIB): $(obj).depend $(OBJS) -
$(AR) $(ARFLAGS) $@ $(OBJS) -
######################################################################### -
# defines $(obj).depend target -
include $(SRCTREE)/rules.mk -
sinclude $(obj).depend -
########################################################################
2、在顶层Makefile添加如下代码:
LIBS += drivers/hi_gpio/libhi_gpio.a
3、在include/configs/hi3516a.h中添加如下代码:
#define CONFIG_HI3516A_GPIO
在include下增加hi_gpio.h文件,内容如下:
-
[yangzheng@centos6 u-boot-2010.06]$ cat include/hi_gpio.h -
/******************************************************************************** -
* Copyright: (C) 2016 Yang Zheng -
* All rights reserved. -
* -
* Filename: hi_gpio.h -
* Description: This head file is control hisi gpio -
* -
* Version: 1.0.0(09/21/2016~) -
* Author: Yang Zheng -
* ChangeLog: 1, Release initial version on "09/21/2016 06:09:49 PM" -
* -
********************************************************************************/ -
#ifndef __HI_GPIO_H__ -
#define __HI_GPIO_H__ -
extern int clear_irled(void); -
#endif
4、在arch/arm/lib/board.c 里面调用即可,如:
-
[yangzheng@centos6 u-boot-2010.06]$ vim arch/arm/lib/board.c -
void start_armboot (void) -
{ -
init_fnc_t **init_fnc_ptr; -
char *s; -
#ifdef CONFIG_HAS_SLAVE -
char *e; -
#endif -
#if defined(CONFIG_VFD) || defined(CONFIG_LCD) -
unsigned long addr; -
#endif -
#ifdef CONFIG_HI3516A_GPIO -
clear_irled(); // clear ir led, add by yangzheng 2016.9.21 -
#endif -
……
重新编译即可,调试uboot的方法:
如果设备有网口,可用tftp服务下载:
sf probe 0
mw.b 82000000 ff 0x80000
tftp 82000000 u-boot.bin
go 82000000
如果没有网口,可用串口下载:
sf probe 0
mw.b 82000000 ff 0x80000
loady 82000000 u-boot.bin
go 82000000
本文详细介绍在U-Boot中添加GPIO驱动的具体步骤,包括直接修改board.c文件和创建独立驱动模块两种方式,并提供实际代码示例。

3352

被折叠的 条评论
为什么被折叠?



