天嵌IMX6开发板测试-第一篇
1.看下开发板介绍
品牌: 天嵌
CPU型号: NXP i.MX6Q
架构: Cortex_A9
主频: *1GHz
内存: 2GB DDR3
存储: 8GB eMMC FLA(64GB可扩)
2. 看下相关驱动啥的。
驱动 | 在内核中的源码位置 | 系统中的设备名称 |
emmc/sdcard 驱动 |
drivers/mmc/host:sdhci-esdhc-imx.c
sdhci.c
sdhci-platform.c
sdhci-pltfm.c
|
/dev/mmcblk* |
LCD 与 LVDS 驱动 | drivers/video/mxc/ldb.c
mxc_dispdrv.c
mxc_dvi.c
mxc_ipuv3_fb.c
mxc_lcdif.c
|
/dev/fb* |
电阻触摸屏驱动 | drivers/input/touchscreen/tsc2007.module | dev/input/event* |
电容触摸屏驱动 | drivers/input/touchscreen/gt811.module | dev/input/event* |
USB otg 驱动 | drivers/usb/otg/fsl_otg.c | |
有线网络驱动 | drivers/net/fec.module | eth0 |
串口驱动 |
drivers/tty/serial/imx.c
mxc_uart_early.c
serial_core.c
|
/dev/ttySAC* |
sgtl5000声卡驱动 | sound/soc/imx/* | /dev/snd/* |
I2C 驱动 | drivers/i2c/busses/i2c-imx.c | |
按键驱动 | drivers/input/keyboard/gpio_keys.c | dev/input/event* |
红外驱动 | drivers/input/keyboard/tq_hs0038.module | dev/input/event* |
背光灯驱动 | drivers/video/backlight/pwm_bl.c drivers/video/backlight/backlight.c | |
pwm 驱动 | arch/arm/plat-mxc/pwm.c | |
RTC 驱动 | drivers/rtc/rtc-pcf8563.c | /dev/rtc0 |
看门狗驱动 | drivers/watchdog/imx2_wdt.c | /dev/watchdog |
多媒体摄像头驱动 | drivers/media/video/mxc/capture/* | /dev/video* |
3. 看下资料的下载,在淘宝找的
下载资料 | 下载链接 |
TQIMX6_android_V3.12.part01 | http://pan.baidu.com/s/1slA1doD 密码:vpad |
TQIMX6_android_V3.12.part02 | http://pan.baidu.com/s/1mikSS1E 密码:cac7 |
TQIMX6_android_V3.12.part03 | http://pan.baidu.com/s/1kVmqJKb 密码:x5yj |
TQIMX6_android_V3.12.part04 | http://pan.baidu.com/s/1eR9RvRO 密码:vwra |
TQIMX6_android_V3.12.part05 | http://pan.baidu.com/s/1hrIAHOK 密码:nhfe |
TQIMX6_android_V3.12.part06 | http://pan.baidu.com/s/1gfLAL4R 密码:qyu6 |
TQIMX6_android_V3.12.part07 | http://pan.baidu.com/s/1hsgXpwK 密码:l7h7 |
TQIMX6_android_V3.12.part08 | http://pan.baidu.com/s/1dFniWmP 密码:bo8r |
TQIMX6_android_V3.12.part09 | http://pan.baidu.com/s/1bo7p7f5 密码:nva2 |
TQIMX6_android_V3.12.part10 | http://pan.baidu.com/s/1mhRqdQw 密码:hawo |
Android镜像(6.0) | http://pan.baidu.com/s/1qXEWAxm 密码:pljv |
Linux镜像(4.1) | http://pan.baidu.com/s/1dFpQUNv 密码:2b8l |
Linux文件系统镜像.part1 | http://pan.baidu.com/s/1jHPYnBK 密码:3t0h |
Linux文件系统镜像.part2 | http://pan.baidu.com/s/1bo9XzD9 密码:pgim |
Linux平台工具 | http://pan.baidu.com/s/1miGGWPU 密码:5fhr |
Linux资源 | http://pan.baidu.com/s/1skS1Oc9 密码:g1ud |
Windows平台工具 | http://pan.baidu.com/s/1pLMG23x 密码:hihw |
配套电路图 | http://pan.baidu.com/s/1hsw6ulm 密码:92ym |
配套教材集 | https://pan.baidu.com/s/1nvQj4N3 密码:g9v7 |
配套芯片手册 | http://pan.baidu.com/s/1dEUSeL7 密码:sx1b |
TQIMX6Q(V3) QT5.5开发境搭建 | http://pan.baidu.com/s/1i4Q3hTb 密码:vh9f |
Qt快速入门攻略 | http://www.armbbs.net/forum.php?mod=viewthread&tid=21338&extra= |
4. 看下uboot的源码,根据手册是
./build_sh 编译
5. 是的,你比较厉害,-j8用8个线程去编译。
export ARCH=arm
export CROSS_COMPILE=arm-linux-
make mx6q_sabresd_android_config
make -j8
6. 找到mx6q_sabresd_android_config,没搞明白,2个make可以放在一起?打开IMX6_CoreC_CD\Linux 源码包\uboot源码\uboot_IMX6_CoreC_1.3.4_for_Linux\Makefile
mx6q_sabresd_config \
mx6q_sabresd_android_config \
mx6q_sabresd_mfg_config \
mx6q_sabresd_iram_config : unconfig
@[ -z "$(findstring iram_,$@)" ] || \
{ echo "TEXT_BASE = 0x00907000" >$(obj)board/freescale/mx6q_sabresd/config.tmp ; \
echo "... with iram configuration" ; \
}
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 mx6q_sabresd freescale mx6
7. 上面的几个参数,arm是构架 arm_cortexa8是CPU型号 mx6q_sabresd是板子的型号 freescale mx6
8. 找到链接文件uboot_IMX6_CoreC_1.3.4_for_Linux\board\freescale\mx6q_sabresd\u-boot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000; //放置的起始位置 . = ALIGN(); //4字节对齐
.text : //代码段
{
/* WARNING - the following is hand-optimized to fit within */
/* the sector layout of our flash chips! XXX FIXME XXX */
board/freescale/mx6q_sabresd/flash_header.module (.text.flasheader) //天嵌定制?
cpu/arm_cortexa8/start.o //启动文件
board/freescale/mx6q_sabresd/libmx6q_sabresd.a (.text)
lib_arm/libarm.a (.text)
net/libnet.a (.text)
drivers/mtd/libmtd.a (.text)
drivers/mmc/libmmc.a (.text) . = DEFINED(env_offset) ? env_offset : .;
common/env_embedded.o(.text) *(.text)
} . = ALIGN(); //只读数据段,ROM
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(); //数据段
.data : { *(.data) } . = ALIGN();
.got : { *(.got) } . = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .; . = ALIGN();
_end_of_copy = .; /* end_of ROM copy code here */ /* Extend to align to 0x1000, then put the Hab Data */
. = ALIGN(0x1000);
__hab_data = .;
. = . + 0x2000;
__data_enc_key = .;
/* actually, only 64bytes are needed, but this generates
a size multiple of 512bytes, which is optimal for SD boot */
. = . + 0x200;
__hab_data_end = .;
/* End of Hab Data, Place it before BSS section */ __bss_start = .;
.bss : { *(.bss) }
_end = .;
}
9. 第一行,这个不清楚是啥,天嵌定制的?
board/freescale/mx6q_sabresd/flash_header.module (.text.flasheader)
10.第2个链接的文件是start.c
#include <config.h>
#include <version.h> .globl _start //定义一个全局可见的变量
_start: b reset //问题,哪里算是_start的结束?下一个冒号的位置
ldr pc, _undefined_instruction //未定义指令
ldr pc, _software_interrupt //软件中断向量
ldr pc, _prefetch_abort //预取指令中断向量
ldr pc, _data_abort//数据操作异常向量
ldr pc, _not_used /、未使用
ldr pc, _irq//慢速中断向量
ldr pc, _fiq//快速中断向量 _undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_pad: .word 0x12345678 /* now 16*4=64 */
.global _end_vect
_end_vect:
11. 上面的.wordirq说是是什么意思,点是什么意思?加点的是伪指令,不会被编译的,理解如下.word是一个汇编伪指令,表示是一个字节,.word是伪操作,用于分配一小段字内存单元
_software_interrupt: .word software_interrupt //_software_interrupt = software_interrupt
12. 下面是reset的代码
reset:
/*
* set the cpu to SVC32 mode
*//ARM有7种模式,SVC是特权模式,可以访问所有寄存器
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
/* the mask ROM code should have PLL and others stable */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
13.首先会将CPU的工作模式设置为svc32模式,然后便调用 cpu_init_crit ,需要注意的是,这里使用的是 bl 指令,也就是说在运行完 cpu_init_crit 标号处的代码之后,会通过这个指令返回来
mov pc, lr @ back to my caller
14. 跳转到cpu_init_crit
cpu_init_crit:
/*
* Invalidate L1 I/D
*/
mov r0, # @ set up for MCR
mcr p15, , r0, c8, c7, @ invalidate TLBs
mcr p15, , r0, c7, c5, @ invalidate icache /*
* disable MMU stuff and caches
*/
mrc p15, , r0, c1, c0,
bic r0, r0, #0x00002000 @ clear bits (--V-)
bic r0, r0, #0x00000007 @ clear bits : (-CAM)
orr r0, r0, #0x00000002 @ set bit (--A-) Align
orr r0, r0, #0x00000800 @ set bit (Z---) BTB
mcr p15, , r0, c1, c0, /*
* Jump to board specific initialization...
* The Mask ROM will have already initialized
* basic memory. Go here to bump up clock rate and handle
* wake up conditions.
*/
mov ip, lr @ persevere link reg across call
bl lowlevel_init @ go setup pll,mux,memory
mov lr, ip @ restore link
mov pc, lr @ back to my caller
15.找到lowlevel_init这个函数,E:\arm_a\IMX6_CoreC_CD\Linux 源码包\uboot源码\uboot_IMX6_CoreC_1.3.4_for_Linux\board\freescale\mx6q_sabresd\lowlevel_init.S
.globl lowlevel_init
lowlevel_init:
inv_dcache
init_l2cc
init_aips
init_clock
mov pc, lr
16. 接下来一个尴尬的问题,不知道程序接下来往哪里走了!!假设汇编代码是顺序执行的,那么接下来是relocate
relocate: @ relocate U-Boot to RAM
adr r0, _start @ r0 <- current position of code
ldr r1, _TEXT_BASE @ test if we run from flash or RAM
cmp r0, r1 @ don't reloc during debug
beq stack_setup ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 @ r2 <- size of armboot
add r2, r0, r2 @ r2 <- source end address copy_loop: @ copy bytes at a time
ldmia r0!, {r3 - r10} @ copy from source address [r0]
stmia r1!, {r3 - r10} @ copy to target address [r1]
cmp r0, r2 @ until source end addreee [r2]
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */ /* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE @ upper KiB: relocated uboot
sub r0, r0, #CONFIG_SYS_MALLOC_LEN @ malloc area
sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE @ bdinfo
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, # @ leave words for abort-stack
and sp, sp, #~ @ byte alinged for (ldr/str)d /* Clear BSS (if any). Is below tx (watch load addr - need space) */
clear_bss:
ldr r0, _bss_start @ find start of bss segment
ldr r1, _bss_end @ stop here
mov r2, #0x00000000 @ clear value
clbss_l:
str r2, [r0] @ clear BSS location
cmp r0, r1 @ are we at the end yet
add r0, r0, # @ increment clear index pointer
bne clbss_l @ keep clearing till at end #ifdef CONFIG_ARCH_MMU
bl board_mmu_init
#endif
ldr pc, _start_armboot @ jump to C code _start_armboot: .word start_armboot
17. 跳入到C语言函数中start_armboot,但是这个函数在哪里?还好在书中找到了答案。uboot_IMX6_CoreC_1.3.4_for_Linux\lib_arm\board.c
void start_armboot (void)
{
init_fnc_t **init_fnc_ptr;
char *s;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif /* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory"); memset ((void*)gd, , sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, , sizeof (bd_t)); gd->flags |= GD_FLG_RELOC; monitor_flash_len = _bss_start - _armboot_start; for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != ) {
hang ();
}
} /* armboot_start is defined in the board-specific linker script */
mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN); #ifndef CONFIG_SYS_NO_FLASH
/* configure available FLASH banks */
display_flash_config (flash_init ());
#endif /* CONFIG_SYS_NO_FLASH */ #ifdef CONFIG_VFD
# ifndef PAGE_SIZE
# define PAGE_SIZE
# endif
/*
* reserve memory for VFD display (always full pages)
*/
/* bss_end is defined in the board-specific linker script */
addr = (_bss_end + (PAGE_SIZE - )) & ~(PAGE_SIZE - );
vfd_setmem (addr);
gd->fb_base = addr;
#endif /* CONFIG_VFD */ #ifdef CONFIG_LCD
/* board init may have inited fb_base */
if (!gd->fb_base) {
# ifndef PAGE_SIZE
# define PAGE_SIZE
# endif
/*
* reserve memory for LCD display (always full pages)
*/
/* bss_end is defined in the board-specific linker script */
addr = (_bss_end + (PAGE_SIZE - )) & ~(PAGE_SIZE - );
lcd_setmem (addr);
gd->fb_base = addr;
}
#endif /* CONFIG_LCD */ #if defined(CONFIG_CMD_NAND)
puts ("NAND: ");
nand_init(); /* go init the NAND */
#endif #if defined(CONFIG_CMD_ONENAND)
onenand_init();
#endif #ifdef CONFIG_HAS_DATAFLASH
AT91F_DataflashInit();
dataflash_print_info();
#endif #ifdef CONFIG_GENERIC_MMC
#ifndef CONFIG_DIS_BOARD_INFO
puts ("MMC: ");
#endif
mmc_initialize (gd->bd);
#endif /* initialize environment */
env_relocate (); #ifdef CONFIG_VFD
/* must do this after the framebuffer is allocated */
drv_vfd_init();
#endif /* CONFIG_VFD */ #ifdef CONFIG_SERIAL_MULTI
serial_initialize();
#endif /* IP Address */
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); #if defined CONFIG_SPLASH_SCREEN && defined CONFIG_VIDEO_MX5
setup_splash_image();
#endif stdio_init (); /* get the devices list going. */ jumptable_init (); #if defined(CONFIG_API)
/* Initialize API */
api_init ();
#endif console_init_r (); /* fully init console as a device */ #if defined(CONFIG_ARCH_MISC_INIT)
/* miscellaneous arch dependent initialisations */
arch_misc_init ();
#endif
#if defined(CONFIG_MISC_INIT_R)
/* miscellaneous platform dependent initialisations */
misc_init_r ();
#endif /* enable exceptions */
enable_interrupts (); /* Perform network card initialisation if necessary */
#ifdef CONFIG_DRIVER_TI_EMAC
/* XXX: this needs to be moved to board init */
extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
if (getenv ("ethaddr")) {
uchar enetaddr[];
eth_getenv_enetaddr("ethaddr", enetaddr);
davinci_eth_set_mac_addr(enetaddr);
}
#endif #ifdef CONFIG_DRIVER_CS8900
/* XXX: this needs to be moved to board init */
cs8900_get_enetaddr ();
#endif #if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96)
/* XXX: this needs to be moved to board init */
if (getenv ("ethaddr")) {
uchar enetaddr[];
eth_getenv_enetaddr("ethaddr", enetaddr);
smc_set_mac_addr(enetaddr);
}
#endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */ #if defined(CONFIG_ENC28J60_ETH) && !defined(CONFIG_ETHADDR)
extern void enc_set_mac_addr (void);
enc_set_mac_addr ();
#endif /* CONFIG_ENC28J60_ETH && !CONFIG_ETHADDR*/ /* Initialize from environment */
if ((s = getenv ("loadaddr")) != NULL) {
load_addr = simple_strtoul (s, NULL, );
}
#if defined(CONFIG_CMD_NET)
if ((s = getenv ("bootfile")) != NULL) {
copy_filename (BootFile, s, sizeof (BootFile));
}
#endif #ifdef BOARD_LATE_INIT
board_late_init ();
#endif #ifdef CONFIG_ANDROID_RECOVERY
check_recovery_mode();
#endif #if defined(CONFIG_CMD_NET)
#if defined(CONFIG_NET_MULTI)
#ifndef CONFIG_DIS_BOARD_INFO
puts ("Net: ");
#endif
#endif
eth_initialize(gd->bd);
#if defined(CONFIG_RESET_PHY_R)
debug ("Reset Ethernet PHY\n");
reset_phy();
#endif
#endif
#ifdef CONFIG_FASTBOOT
check_fastboot_mode();
#endif
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
} /* NOTREACHED - no way out of command loop except booting */
}
//结束
天嵌IMX6开发板测试-第一篇的更多相关文章
- LARK BOARD开发板试用第一篇-上电测试学习
1. 先看下板子外观,做工很不错 2. 主芯片的型号是,SoC 为 Cyclone V SX 系列的 5CSXFC6D6F31,不仅在芯片中包含传统的 FPGA 架构,还集成了基于 ARM Corte ...
- nexys4开发板使用-第一篇(未完成)
1. 下去下个原理图.今天准备研究下DDR的控制,看介绍新一代的Nexys 4 DDR最值得被关注的改良是将原先的16 MiBCellularRAM升级为128 MiB的DDR2 SDRAM内存.Di ...
- itop-4412开发板使用第一篇-信号量的学习使用
1. 本次基于itop-4412研究下Linux信号量的使用方法. 2. 创建信号量的函数,信号量的头文件在那个路径?编译应用程序的话,头文件有3个路径,内核源码头文件,交叉编译器头文件,ubuntu ...
- 创龙DSP6748开发板上电测试-第一篇
1. 创龙DSP6748开发板测试.2980元的售价很高,我估计新的1200元比较合适,当然创龙定价是按照供需关系的.仿真器XDS100V2卖598元,真是狮子大张口. 2. 上电是5V-2A的电源. ...
- 迅为-IMX6开发板十层PCB制造,24小时开机测试,满负荷测试运行俩天,没有死机
迅为-IMX6开发板——工业主板的优势 1.元器件 IMX6工业主板选料,选用经过长时间.高要求验证元器件,保证产品在复杂条件下,耐高温.抗潮湿等工业场合的需求. 2.PCB设计 IMX6工业主板采用 ...
- QtCreator设置野火iMx6开发板提供的qt交叉编译套件
在Ubuntu18 QtCreator上添加野火iMx6开发板的Qt交叉编译环境PC:Ubuntu18.04QtCreator: 4.8.2交叉编译环境:野火提供的 5-编译工具链->qt交叉编 ...
- IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像
搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...
- 迅为IMX6开发板适用于HMI|车载电脑|工业控制|医疗仪器|智能家居 灵活进行产品开发平台
i.MX6开发平台行业中的应用 适用于HMI.POS机.车载电脑.工业控制.轨道交通.医疗仪器.智能家居.数据终端等行业. 迅为iMX6开发板采用核心板+底板结构设计,高品质,稳定性强,可以更灵活地进 ...
- IMX6开发板虚拟机加载Ubuntu12.04.2镜像
基于迅为IMX6开发板安装好虚拟机之后,用户就可以加载 Ubuntu12.04.2 镜像.用户可以在网盘中下载“编译好的镜像”,该镜像已经安装好了编译 Android4.4.2 所需要的大部分软件.用 ...
随机推荐
- Centos 安装libevent
1.在http://libevent.org/下载libevent-2.1.8-stable.tar.gz 2.解压缩 tar -zxvf libevent-2.1.8-stable.tar.gz c ...
- Mac OS系统下配置hosts的方法
首先,介绍下什么是hosts Hosts是一个没有扩展名的系统文件,可以用系统自带的记事本等工具打开,作用就是将一些常用的网址域名与其对应的IP地址建立一个关联,当用户在浏览器输入一个需要登录的网址时 ...
- 计算机网络概述4_性能指标之时延,时延带宽积,往返时间RTT,利用率
发送时延(传输时延):从发送分组的第一个比特算起,到该分组的最后一个比特发送完毕所需的时间. 总结:
- [LCOI2018][WX] Tirpitz
\([LCOI2018][WX11.1]~Tirpitz\) 时限:1s 内存限制:131072KB 输入文件: T.in 输出文件: T.out 题目背景 王九日很颓废,这也就是他为什么这么弱的原 ...
- x+=i和x = x+i比较 -- 简单赋值和复合赋值
这两个赋值方式其实是有区别的,如果最后结果的类型和左操作数的类型一样,那么这两个表达式就完全等价. 下面来看看两个例子来理解它们的区别: 编写一个程序,使得x+=i合法, x = x+i: 不合法. ...
- 利用来JS控制页面控件显示和隐藏有两种方法
利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位. 方法一: 1 2 document.getEle ...
- 使用Analyze 和Instruments-Leaks分析解决iOS内存泄露
版权声明:本文为博主原创文章,未经博主允许不得转载. 使用Analyze和Instruments-Leaks分析解决iOS内存泄露 实验的开发环境:Xcode 7 一.使用Product-An ...
- New Language Features in C# 6
Source:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6 This document describes ...
- 使你的ActiveX控件执行时不弹出安全性提示(转载)
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 042-43
记录刷题情况 ------------------------------------------------L1-042--------------------------------------- ...