u-boot-1.3.4 移植到S3C2440 (带有某些解析)
将__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
改为__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
改为
/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#else
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses 该地址用来屏蔽中断*/
# define INTSUBMSK 0x4A00001C /*该地址用来屏蔽子中断*/
# define CLKDIVN 0x4C000014 /* clock divisor register 该地址用来决定FCLK、HCLK、PCLK的比例 */
#if defined(CONFIG_S3C2440)
#define PSDIV_405 0x21 /* qljt 同上,同时设定PDIV和SDIV的值,PDIV和SDIV参见 S3C2440A.pdf*/
#endif
#endif
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff // 根据2410芯片手册,INTSUBMSK有11位可用,
//vivi 也是0x7ff,不知为什么U-Boot一直没改过来。但是由于芯片复位默认
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
# if defined(CONFIG_S3C2440)
ldr r1, =0x7fff //根据2440芯片手册,INTSUBMSK有15位可用
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
/*这三条协处理器命令确实不知道什么意思,在ATXJGYBC_ql.pdf中搜p15和c1,只知道它们执行以后会把协处理器p15的寄存器c1的最高两位置1,但c1的最高两位是没有意义啊,弄不懂它的真正意思
mrc p15, 0, r1, c1, c0, 0 /*read ctrl register qljt*/
orr r1, r1, #0xc0000000 /*Asynchronous qljt 改变总线模式为异步模式网上某位朋友说不知到在哪里看到过
mcr p15, 0, r1, c1, c0, 0 /*write ctrl register qljt*/ #if defined(CONFIG_S3C2440) // (2440的主频可达533MHz,但听说设到533MHz时系统
/*now, CPU clock is 405.00 Mhz qljt*/
mov r1, #CLK_CTL_BASE /* qljt*/
mov r2, #MDIV_405 /* mpll_405mhz qljt*/
add r2, r2, #PSDIV_405 /* mpll_405mhz qljt*/
str r2, [r1, #0x04] /* MPLLCON qljt 实际上是设置寄存器CLK_CTL_BASE+0x04=0x4c000004的值 */
#endif
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410|| CONFIG_S3C2440 */
将以下U-Boot的重定向语句段:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
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:
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
然后添加:
/*下载了一个vivi源代码看了一下,还真的有下面哪一段代码*/
#ifdef CONFIG_S3C2440_NAND_BOOT @qljt@@@@@@@@@@@@@@@@SSSSSSSSSSSSS
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF] /* 这些宏是在include/configs/qljt2440.h中被定义的*/
ldr r2, [r1, #oNFCONF] /* 还是弄不懂为什么上面一句str以后还要有这句的ldr命令?why?难道是多余的?*/ ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
str r2, [r1, #oNFCONT]
ldr r2, [r1, #oNFCONT] ldr r2, =(0x6) @ RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT] mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
/*delay一段时间*/
mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
/*等待nand-flash的复位完毕信号*/
nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x4
beq nand2 ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 @ Flash Memory Chip Disable /* 在这里先Display fansh CE先,在C函数中对falsh进行 */
/*下面这段用来初始化栈指针sp和帧指针fp,至于它们的定义和作用参考文件夹 ” 栈指针sp和帧指针fp”里面的内容
@ get ready to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer /*sp 是指堆栈指针*/
mov fp, #0 @ no previous frame, so fp=0
@ copy U-Boot to RAM /*vivi里面应该是有一段是针对gpio的程序,也许使用来debug用的信号灯,这里省略了*/
/* TEXT_BASE 是uboot自己的入口地址,在u-boot-1.3.4-board/qljt/qljt2440的config.mk中定义
mov r1, #0x0 /*r1 : 从falsh的那个位置开始复制*/
mov r2, #0x20000 /*r2 : 复制多大的内容*/
bl nand_read_ll /* 跳到执行uboot复制的程序入口,这个函数从哪里来?也是来自vivi的,没办法*/
tst r0, #0x0 /* 这里特别注意r0的值是指nand_read_ll 执行完以后的返回值,而不是上面
beq ok_nand_read
bad_nand_read: /*如果读nand_read失败的话,那么sorry,重来,或者检查硬件*/
loop2: b loop2 @ infinite loop
ok_nand_read:
@ verify
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3: b loop3 @ infinite loop
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F
ldr r2,=0x5500
str r2, [r1, #oGPIO_CON]
mov r2, #0xff
str r2, [r1, #oGPIO_UP]
mov r2, #0xdf
str r2, [r1, #oGPIO_DAT]
.align 2 /*??? 这里我一直不明白为什么是 .align 2,因为如果按照ARM的规则,意思是按照 2的2次方=4bit的
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4 /* 从这里可以看出该堆栈是从高地址向低地址增长的
......
/*
* Nandflash Boot
*/
#define CONFIG_S3C2440_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
/* NAND Flash Controller */
#define NAND_CTL_BASE 0x4E000000
/* Offset */
#define oNFCONF 0x00 /*这些宏是在start.S中被调用的*/
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFADDR 0x0c
#define oNFDATA 0x10
#define oNFSTAT 0x20
#define oNFECC 0x2c
#define GPIO_CTL_BASE 0x56000000
#define oGPIO_F 0x50
#define oGPIO_CON 0x0 /* R/W, Configures the pins of the port */
#define oGPIO_DAT 0x4 /* R/W, Data register for port */
#define oGPIO_UP 0x8 /* R/W, Pull-up disable register */
#endif /* __CONFIG_H */
#include
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD __REGb(NF_BASE + 0x8)
#define NFADDR __REGb(NF_BASE + 0xC)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)
//#define GPDAT __REGi(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT)
#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}
#define BUSY 4
inline void wait_idle(void) {
while(!(NFSTAT & BUSY));
NFSTAT |= BUSY;
}
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
/*下面这个if保证对flash的读操作是从某一页的页头开始的,从直观来看是保证start_addr[0:8]位都为0,
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
return -1; /* invalid alignment */
}
NAND_CHIP_ENABLE;
for(i=start_addr; i < (start_addr + size);) {
/* READ0 */
NAND_CLEAR_RB;
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
NAND_DETECT_RB;
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
buf++;
}
}
NAND_CHIP_DISABLE;
return 0;
}
......
COBJS := qljt2440.o nand_read.o flash.o
......
依照开发板的内存区的配置情况 , 修改 board/qljt/qljt2440/lowlevel_init.S文件, :
......
/* REFRESH parameter 下面这 6个配置都可以参考 s3c2440A datasheet P210的 REFRESH寄存器 */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trp 0x01 /* 3clk 这个值可以参考本版子上的 SDRAM的 datasheet*/
#define Trc 0x3 /* 也就是 SDRAM datasheet里面的 Tsrc 7clk 本来这个地方是 Trc,但从 lowlevel_init.S里面的调用来看,应该是寄存器REFRESH
#define REFCNT 1259 /*这个值的算法参考 s3c2440A datasheet P210的Refresh Counter */
......
/*
* High Level Configuration Options
* (easy to change)
*/
#define CONFIG_ARM920T 1 /* This is an ARM920T Core */
#define CONFIG_S3C2440 1 /* 在前面很多地方调用到CONFIG_S3C2440 ,他是在这里定义 */
#define CONFIG_qljt2440 1 /* 针对一些本开发板配置的宏控制*/
......
/***********************************************************
* Command definition
***********************************************************/
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
#include
#define CFG_LONGHELP
/* undef to save memory */
/*Monitor Command Prompt */
#define CFG_CBSIZE 256
/* Console I/O Buffer Size */
......
#define CFG_LOAD_ADDR 0x30008000 /*以后linux kernel就要放在这里执行 */
/* default load address */
......
#define CFG_ENV_IS_IN_NAND 1 /*定义这个宏的目的是为了调用nand flash类型的saveenv
#define CFG_ENV_OFFSET 0x30000
#define CFG_NAND_LEGACY 1
/*----------------------------------------------------------------------
* NAND flash settings
*/
#if defined (CONFIG_CMD_NAND)
#define CFG_NAND_BASE 0x4E000000 /*这个鬼东西在drivers/mtd/nand/nand.c中被调用,它
/* NandFlash控制器在SFR区起始寄存器地址 */
#define CFG_MAX_NAND_DEVICE 1
/* 支持的最在Nand Flash数据 */
#define SECTORSIZE 512
/* 1页的大小 */
#define NAND_SECTOR_SIZE SECTORSIZE /*这两个东西好像也是多余的,备用吧,在次文章搜一下
#define NAND_BLOCK_MASK 511 /*本flash一个block的大小-1*/
/* 页掩码 */
#define ADDR_COLUMN 1 /*意思是你所用的nandflash的Column地址占多少个字节*/
/* 一个字节的Column地址 */
/* 3字节的页块地址!!!!!*/
#define ADDR_COLUMN_PAGE 4 /*意思是你所用的nandflash的column地址+page地址共占多少个字节*/
/* 总共4字节的页块地址!!!!! */
#define NAND_ChipID_UNKNOWN 0x00
/* 未知芯片的ID号 */
#define NAND_MAX_FLOORS 1 /*怎样算一floor*/
#define NAND_MAX_CHIPS 1
/* Nand Flash命令层底层接口函数 */
/* 允许Nand Flash写校验 打开下面宏定义*/
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
......
typedef enum {
NFCE_LOW,
NFCE_HIGH
} NFCE_STATE;
static inline void NF_Conf(u16 conf)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONF = conf;
}
static inline void NF_Cmd(u8 cmd)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCMD = cmd;
}
static inline void NF_CmdW(u8 cmd)
{
NF_Cmd(cmd);
udelay(1);
}
static inline void NF_Addr(u8 addr)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFADDR = addr;
}
static inline void NF_WaitRB(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
while (!(nand->NFSTAT & (1<<0)));
}
static inline void NF_Write(u8 data)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFDATA = data;
}
static inline u8 NF_Read(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
return(nand->NFDATA);
}
static inline u32 NF_Read_ECC(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
return(nand->NFECC);
}
#if defined(CONFIG_S3C2440)
static inline void NF_Cont(u16 cont)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONT = cont;
}
static inline void NF_SetCE(NFCE_STATE s)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
switch (s) {
case NFCE_LOW:
nand->NFCONT &= ~(1<<1);
break;
case NFCE_HIGH:
nand->NFCONT |= (1<<1);
break;
}
}
static inline void NF_Init_ECC(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONT |= (1<<4);
}
#else
static inline void NF_SetCE(NFCE_STATE s)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
switch (s) {
case NFCE_LOW:
nand->NFCONF &= ~(1<<11);
break;
case NFCE_HIGH:
nand->NFCONF |= (1<<11);
break;
}
}
static inline void NF_Init_ECC(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONF |= (1<<12);
}
#endif /*对应#if defined(CONFIG_S3C2440)*/
static inline void NF_Init(void)
{
#if 0
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
#else
#define TACLS 0
#define TWRPH0 4
#define TWRPH1 2
#endif
#if defined(CONFIG_S3C2440)
NF_Conf((TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4));
NF_Cont((0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1<<0));
#else
NF_Conf((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0));
/*nand->NFCONF = (1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0); */
/* 1 1 1 1, 1 xxx, r xxx, r xxx */
/* En 512B 4step ECCR nFCE=H tACLS tWRPH0 tWRPH1 */
#endif
NF_Reset();
}
#endif
{
......
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
//qljt /*这两个PLL的算法参见S3C2440datasheet的254页*/
#if defined(CONFIG_S3C2440)
if (pllreg == MPLL)
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* CONFIG_SYS_CLK_FREQ 在qljt2440.h中定义*/
else if (pllreg == UPLL)
#endif
//qljt
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
第66、85、142、150、174行:
将“#ifdef CONFIG_S3C2410”改为
#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
#if defined(CONFIG_ARM920T) || \
defined(CONFIG_S3C2400) || \
defined(CONFIG_S3C2410) || \
defined(CONFIG_S3C2440) || \
defined(CONFIG_440EP) || \
defined(CONFIG_PCI_OHCI) || \
defined(CONFIG_MPC5200)
......
#include
#include
#include
#include
#include
#include
#include
......
......
#ifdef CONFIG_INFERNO
#error CONFIG_INFERNO not supported yet
#endif
int nand_legacy_rw (struct nand_chip* nand, int cmd,
size_t start, size_t len,
size_t * retlen, u_char * buf);
extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
extern int nand_legacy_erase(struct nand_chip *nand, size_t ofs, size_t len, int clean);
/* info for NAND chips, defined in drivers/nand/nand.c */
nand_info_t nand_info[CFG_MAX_NAND_DEVICE];
......
#else /* ! CFG_ENV_OFFSET_REDUND */
int saveenv(void)
{
size_t total;
int ret = 0;
nand_erase_options_t nand_erase_options;
nand_erase_options.length = CFG_ENV_RANGE;
nand_erase_options.quiet = 0;
nand_erase_options.jffs2 = 0;
nand_erase_options.scrub = 0;
nand_erase_options.offset = CFG_ENV_OFFSET;
if (CFG_ENV_RANGE < CFG_ENV_SIZE)
return 1;
puts ("Erasing Nand...\n");
// if (nand_erase_opts(&nand_info[0], &nand_erase_options))
if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))
puts ("Writing to Nand... ");
total = CFG_ENV_SIZE;
// if (writeenv(CFG_ENV_OFFSET, (u_char *) env_ptr)) {
// puts("FAILED!\n");
// return 1;
// }
if (ret || total != CFG_ENV_SIZE)
return 1;
puts ("done\n");
return ret;
}
#else /* ! CFG_ENV_OFFSET_REDUND */
.......
/*
* The legacy NAND code saved the environment in the first NAND device i.e.,
* nand_dev_desc + 0. This is also the behaviour using the new NAND code.
*/
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
size_t total;
int ret;
total = CFG_ENV_SIZE;
// ret = readenv(CFG_ENV_OFFSET, (u_char *) env_ptr);
ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET,CFG_ENV_SIZE, &total, (u_char*)env_ptr);/*edited by yaoyi 20090314,1.3.4是先进入到readenv,而非直接调用nand_legacy_rw。 因此干脆就不用到readenv了,直接注释掉,添加以上代码 */
if (ret || total != CFG_ENV_SIZE)
return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}
u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两个文件中实现。其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用 drivers/nand/nand.c中的nand_init();否则调用自己在board/qljt/qljt2440/qljt2440.c中的nand_init()函数。这里我选择第二种方式。*/
.......
//#ifndef CFG_NAND_LEGACY
#include
#include
#include
.......
{"Samsung KM29N16000",NAND_MFR_SAMSUNG, 0x64, 21, 1, 2, 0x1000, 0},
{"Samsung K9F1208U0B", NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},
{"Samsung unknown 4Mb", NAND_MFR_SAMSUNG, 0x6b, 22, 0, 2, 0x2000, 0},
......
#include
#include
#include
#include
#include
{
debug ("U-Boot code: %08lX -> %08lX BSS: -> %08lX\n",
_armboot_start, _bss_start, _bss_end);
printf ("U-Boot code: %08lX -> %08lX BSS: -> %08lX\n", //qljt
_armboot_start, _bss_start, _bss_end); //qljt
#ifdef CONFIG_MODEM_SUPPORT
debug ("Modem Support enabled\n");
#endif
#ifdef CONFIG_USE_IRQ
debug ("IRQ Stack: %08lx\n", IRQ_STACK_START);
debug ("FIQ Stack: %08lx\n", FIQ_STACK_START);
#endif
return (0);
}
CONFIG_COMMANDS&
CFG_CMD_NAND
|
CFG_NAND_LEGACY
|
/drivers/mtd/nand/nand.c中的
nand_init()函数
|
/board/qljt/qljt2440/qljt2440.c中的 nand_init()函数
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
u-boot-1.3.4 移植到S3C2440 (带有某些解析)相关推荐
- mplayer移植到S3C2440(二)
相信大家在前面弄了下会发现在开发板上还是不能播放文件,这里还得修改下内核: 内核版本:2.6.12 编译器版本:arm-linux-gcc 3.4.1 1 修改/arch/arm/mach-s3c2 ...
- Spring Boot:(六)默认日志logback配置解析
Spring Boot:(六)默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日 ...
- Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板)
Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板) 1. 加入依赖 2. 对读取excel内容(批量添加) 3. 模板下载: 1. 加入依赖 <depende ...
- linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)
忙乎了一个下午,总算忙乎出来了,不过前期大量的搜索工作别人已经完成. 大量参考:http://blog.csdn.net /huihui1988/archive/2010/08/09/5799500. ...
- u-boot-1.3.4 移植到S3C2440
2019独角兽企业重金招聘Python工程师标准>>> 一.预备知识: 1. 首先, U-Boot1.3.4 还没有支持 s3c2440 ,移植仍是用 2410 的文件稍 ...
- linux mpc boot 串口初始化,uboot移植阶段二--3串口终结篇
2011-03-20 23:00:37 前天U-boot移植串口后,能成功显示数据. 今天的主要目的是再次进行U-boot移植.看是否成功.花了40分钟,很顺利. 接着就是要把之前有问题的U-boot ...
- Spring Boot Profile使用详解及配置源码解析
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 二师兄 来源 | 程序新视界 在实践的过程中我 ...
- Spring Boot文档阅读笔记-对Messaging with RabbitMQ解析
此篇教程以Rabbitmq作为消息队列服务端,使用Spring Boot产生和发布消息. 使用Spring AMQP的RabbitTemplate发布消息,使用MessageListenerAdapt ...
- 【2021最新版】Spring Boot面试题总结(92道题含答案解析)
文章目录 1.什么是Spring Boot? 2.为什么要用SpringBoot? 3.Spring Boot有哪些优点? 4.Spring Boot的核心注解是哪个?它主要由哪几个注解组成的? 5. ...
最新文章
- SQL查询语句大全集锦(一)
- linux centos yum 报错 获取GPG密钥失败 Errno 14
- c/c++对象模型大总结:第5-8章、数据成员的存取与布局
- 雷林鹏分享:Ruby Web Services 应用 - SOAP4R
- ModalPopupExtender使用技巧( operate ModalPopupExtender by JavaScript)
- APPSCAN学习目录
- fit函数中verbose含义解释
- Mac与远程服务器数据交互软件Cyberduck
- 华为Mate20系列赢得各界盛誉,棋圣聂卫平也对其AI性能称赞
- 复利现值系数怎么用计算机计算,复利现值系数计算方法是怎样的?
- Python 绘制椭圆 平移 旋转
- 2021.7纪中快乐游记(下)
- Android 三星手机拍照图片旋转处理
- 全国各地DNS地址详细列表
- MySQL中聚合函数count的使用和性能优化
- echarts字变大_EChart 文字大小调整 饼状图为例
- pip install warning
- 【Mybatis】缓存
- 移动物联网卡资费标准,这样收费最划算
- CD2-pFed: Cyclic Distillation-guided Channel Decoupling for ModelPersonalization in Federated Lear论文