Author:杨正date:2016921
目的
在u-boot中添加驱动程序。
详细举例介绍
在uboot中 *** 作寄存器,实现对gpio及外围设备的控制有两种方法,一种是直接在arch/arm/lib/boardc中添加对寄存器的 *** 作代码,如:
#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/hi3516ah clear_irled(); // clear ir led, add by yangzheng 2016921#endif
来自CODE的代码片
snippet_file_0txt
另一种方法:
1、在driver/下新建hi_gpio目录,如:
[yangzheng@centos6 hi_gpio]$ ls
hi_gpioc Makefile
hi_gpioc内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[yangzheng@centos6 hi_gpio]$ cat hi_gpioc/ Copyright: (C) 2016 Yang Zheng<Zhengyang@avatarcontrolscom> All rights reserved Filename: hi_gpioc Description: This file Version: 100(09/21/2016~) Author: Yang Zheng <zhengyang@avatarcontrolscom> ChangeLog: 1, Release initial version on "09/21/2016 05:41:41 PM" /#include<commonh> #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;}
来自CODE的代码片
snippet_file_0txt
Makefile如下(可以拷贝driver目录下的各模块模板):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[yangzheng@centos6 hi_gpio]$ cat Makefile## Copyright 2000-2008# Wolfgang Denk, DENX Software Engineering, wd@denxde## 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)/configmk LIB := $(obj)libhi_gpioa COBJS-$(CONFIG_HI3516A_GPIO) += hi_gpioo COBJS := $(COBJS-y)SRCS := $(COBJS:o=c)OBJS := $(addprefix $(obj),$(COBJS)) all: $(LIB) $(LIB): $(obj)depend $(OBJS) $(AR) $(ARFLAGS) $@ $(OBJS) ######################################################################### # defines $(obj)depend targetinclude $(SRCTREE)/rulesmk sinclude $(obj)depend ########################################################################
来自CODE的代码片
snippet_file_0txt
2、在顶层Makefile添加如下代码:
LIBS += drivers/hi_gpio/libhi_gpioa
3、在include/configs/hi3516ah中添加如下代码:
#define CONFIG_HI3516A_GPIO
在include下增加hi_gpioh文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[yangzheng@centos6 u-boot-201006]$ cat include/hi_gpioh/ Copyright: (C) 2016 Yang Zheng<Zhengyang@avatarcontrolscom> All rights reserved Filename: hi_gpioh Description: This head file is control hisi gpio Version: 100(09/21/2016~) Author: Yang Zheng <zhengyang@avatarcontrolscom> 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
来自CODE的代码片
snippet_file_0txt
4、在arch/arm/lib/boardc 里面调用即可,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[yangzheng@centos6 u-boot-201006]$ vim arch/arm/lib/boardc 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 2016921#endif……
来自CODE的代码片
snippet_file_0txt
重新编译即可,调试uboot的方法:
如果设备有网口,可用tftp服务下载:
sf probe 0
mwb 82000000 ff 0x80000
tftp 82000000 u-bootbin
Go 82000000
如果没有网口,可用串口下载:
sf probe 0
mwb 82000000 ff 0x80000
loady 82000000 u-bootbin
go 82000000
将该 demo 生成的 app(升级用)和 fsbl、最简化 bit 文件(可选)打包成 BOOTBIN,作为 golden image 烧写在 qspi flash 偏移 0 地址开始的位置,其中最简化 bit 文件为在线升级功能提供必要的物理通道(如果不需要,可以不打包该文件),golden image 一旦发布基本不需要进行升级,由该 golden image 负责和上位机进行通信交互,完成业务 app、业务 bit 文件、uboot 以及 *** 作系统 image 等文件在线升级,在 qspi flash 容量足够的情况下,还可以进一步实现多个业务镜像、bit文件并存,通过在线切换不同的bit文件和业务镜像实现不同的功能,业务 bit 文件由业务 APP 负责加载到 PL 中。这个例子是裸机程序下的使用串口实现在线升级功能,对于 *** 作系统下的升级和多业务镜像不在本文中进行讨论, *** 作系统下在线升级和多业务镜像相对更容易实现;用户可以在该 demo 的基础上,在升级过程中增加所有业务 app 和 bit 文件的 CRC 校验,并把 CRC 校验值保存在 flash 中(在 qspi flash 预留从 16M-64KB 开始的 64KB 保留升级相关的信息),启动加载业务app 和bit 文件时,如果某个文件CRC错误,则加载其他备份文件,实现PSOC multiboot的效果。
一,在线升级工作原理和程序流程
软复位重启系统流程不是必须的,可根据需要修改成右边的“加载业务app并启动”的流程。
二,工程简要说明
1,workspace名词解释
2,app工程中在线升级代码解释
3,使用 UART0作为调试串口和升级文件用的通信串口,如果使用UART1,需要修改STDIN BASEADDRESS和STDOUT BASEADDRESS为UART1的基地址。
4,修改波特率的从procise中的BD中修改,比如改为460800
5,修改 fmsh_uartc文件FUartPs_setBaudRate函数fsbl工程和app工程对应的地方都要修改
u8 FUartPs setBaudRate(FUartPs T uartDev, u32 baudRate)
{
uint16 t retval;
u32 divisor;
float divisor f; float tmpi
u32 tmp32 =0; retval=0;
uint16 t fdivisor;
tmp = 16 baudrate;
tmp = (float) (uartDev->input_clock / tmp);
divisor =(u32)tmp;
divisor_f=tmp - divisor;
/波特率小数分频误差修正/
if (((u32) (divisor_f 10) & 10)<5) / 四舍五入/
{
tmp32 = (u32)(divisor_f 10) / 10;
}
else
{
tmp32 = (u32) (divisor_f 10 + 9) / 10;
}
fdivisor =tmp32;
FUartPs setClockDivisor(uartDey, divisor, fdivisor);
return retval;
}
三,在线升级 *** 作流程
1、将 fsbl 和串口升级 app(update_file_qspiout)打包成 BOOTBIN,烧写到qspi flash的0地址,使用 qspi 模式启动单板。
2,完成2个业务 app(HelloWorld1和HelloWorld2)升级后,根据串口提示输入no完成本次轮级,进入设置业务模式下欲启动业务app的信息(这部分信息将保存在qspi flash 16MB-64KB开始的位置)的流程,设置完成自动软复位重启系统。
3,非升级模式下,存在多个业务 APP 时,用户可以设置激活启动 qspi 中的某个业务 APP,用户选择的该业务 app 的信息会被保存在 qspi flash 16MB-64 KB 开始的位置,设置完成自动加载启动该业务 APP。
U-Boot是一种开源的引导加载程序,用于在启动时加载 *** 作系统或其他应用程序。它是在开发板的启动阶段运行的,负责初始化硬件,加载内核映像,以及在启动时执行其他必要的初始化步骤。U-Boot通常作为固件交付给硬件厂商,然后由厂商进行适当的配置和编译。
DTS(设备树源文件)是Linux内核中的一种数据结构,用于描述硬件设备和平台的信息。它提供了一个结构化的方式来描述硬件和设备的连接,以及如何访问它们。DTS文件通常由开发人员编写,描述硬件板子的设备树,然后在编译内核时,通过设备树编译工具生成二进制设备树(DTB)文件。内核启动时会读取DTB文件,并在初始化硬件时使用它。
因此,U-Boot和DTS都是用于嵌入式系统中的组件,但它们的作用不同。U-Boot负责引导加载程序,初始化硬件和加载内核映像,而DTS则描述硬件设备和平台的信息。
以上就是关于如何在uboot中添加驱动程序全部的内容,包括:如何在uboot中添加驱动程序、复旦微u-boot加载bit、uboot和dts有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)