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开发板测试-第一篇的更多相关文章

  1. LARK BOARD开发板试用第一篇-上电测试学习

    1. 先看下板子外观,做工很不错 2. 主芯片的型号是,SoC 为 Cyclone V SX 系列的 5CSXFC6D6F31,不仅在芯片中包含传统的 FPGA 架构,还集成了基于 ARM Corte ...

  2. nexys4开发板使用-第一篇(未完成)

    1. 下去下个原理图.今天准备研究下DDR的控制,看介绍新一代的Nexys 4 DDR最值得被关注的改良是将原先的16 MiBCellularRAM升级为128 MiB的DDR2 SDRAM内存.Di ...

  3. itop-4412开发板使用第一篇-信号量的学习使用

    1. 本次基于itop-4412研究下Linux信号量的使用方法. 2. 创建信号量的函数,信号量的头文件在那个路径?编译应用程序的话,头文件有3个路径,内核源码头文件,交叉编译器头文件,ubuntu ...

  4. 创龙DSP6748开发板上电测试-第一篇

    1. 创龙DSP6748开发板测试.2980元的售价很高,我估计新的1200元比较合适,当然创龙定价是按照供需关系的.仿真器XDS100V2卖598元,真是狮子大张口. 2. 上电是5V-2A的电源. ...

  5. 迅为-IMX6开发板十层PCB制造,24小时开机测试,满负荷测试运行俩天,没有死机

    迅为-IMX6开发板——工业主板的优势 1.元器件 IMX6工业主板选料,选用经过长时间.高要求验证元器件,保证产品在复杂条件下,耐高温.抗潮湿等工业场合的需求. 2.PCB设计 IMX6工业主板采用 ...

  6. QtCreator设置野火iMx6开发板提供的qt交叉编译套件

    在Ubuntu18 QtCreator上添加野火iMx6开发板的Qt交叉编译环境PC:Ubuntu18.04QtCreator: 4.8.2交叉编译环境:野火提供的 5-编译工具链->qt交叉编 ...

  7. IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像

    搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...

  8. 迅为IMX6开发板适用于HMI|车载电脑|工业控制|医疗仪器|智能家居 灵活进行产品开发平台

    i.MX6开发平台行业中的应用 适用于HMI.POS机.车载电脑.工业控制.轨道交通.医疗仪器.智能家居.数据终端等行业. 迅为iMX6开发板采用核心板+底板结构设计,高品质,稳定性强,可以更灵活地进 ...

  9. IMX6开发板虚拟机加载Ubuntu12.04.2镜像

    基于迅为IMX6开发板安装好虚拟机之后,用户就可以加载 Ubuntu12.04.2 镜像.用户可以在网盘中下载“编译好的镜像”,该镜像已经安装好了编译 Android4.4.2 所需要的大部分软件.用 ...

随机推荐

  1. 修改WSAD的默认工作区(转)

    如果要一直用某个目录作为工作区,可以在启动WSAD的时候将该目录设为默认工作区,这样启动时直接启动,方便.快捷.但是如果设置后在想换工作区就比较麻烦了,因为没有可供选择的界面了,跟网上搜了一下总结共有 ...

  2. MySQL语法三:数据控制语句

    数据控制语句MCL(GRANT,REVOKE,COMMIT,ROLLBACK)

  3. luogu3368树状数组模板2

    题目链接:https://www.luogu.org/problemnew/show/P3368 题意:与模板1不同的是这题的操作是树状数组并不在行的区间更新和单点查找,如果按照模板1那样写肯定会T. ...

  4. 全新释放 | RealSight APM, 让客户的极致数字体验成为可能

    根据专业评测机构 downdetector.com 统计,2018年,Facebook 系统全年宕机 200 次,Youtube 宕机  140 次,Google 宕机 100 次.每次宕机损失至少 ...

  5. Linux Shell 编程 文件转置问题

    给定一个文件 file.txt,转置它的内容. 你可以假设每行列数相同,并且每个字段由 ' ' 分隔. 示例: 假设 file.txt 文件内容如下: name age alice 21 ryan 3 ...

  6. Jmeter-常用函数之__CSVRead使用

    可参照:http://www.cnblogs.com/liu-ke/p/4324157.html 压测中有些参数是固定范围内的取值,或者成对出现(如登录帐号和密码),以大量用户同时登录网站为例: 1. ...

  7. 【Javascript-ECMA6-Fetch详解】

    Fetch 由于Fetch API是基于Promise设计,因此旧的浏览器并不支持该API,需要引用时引用es6-promise. 基本知识 fetch请求返回response格式 body Fetc ...

  8. 自动化运维工具Ansible实战(四)常用模块

    转载链接:http://blog.51cto.com/liqingbiao/1962609   Ansible模块按功能分为:云模块.集群模块. 命令模块.数据库模块.文件模块.资产模块.消息模块.监 ...

  9. 03 Oracle分区表

    Oracle分区表   先说句题外话…   欢迎成都天府软件园的小伙伴来面基交流经验~ 一:什么是分区(Partition)? 分区是将一个表或索引物理地分解为多个更小.更可管理的部分. 分区对应用透 ...

  10. iOS多语言设置

    最近公司做的项目需要向国外推广,因此app需要添加相应的语言设置,为此整理记录下多语言设置的过程.如有不对的地方,欢迎各位大神指正.下面就详细介绍下设置的过程: 1.基本设置 第一步:首先在 项目工程 ...