一、DM36X的BOOT过程介绍

DM36x的BOOT过程和DM6446、DM6467完全是一样的,因为都是ARM926EJS架构,里边都有一个RBL,这RBL在芯片出厂的时候都烧写在ROM里,芯片上电复位后RBL在运行,然后读取BOOT MODE引脚的电平状态,决定是从NAND FLASH还是从 MMC/SD、UART 、USB、 SPI、EMAC、HPI中之一的方式BOOT,具体见SPRS558A.pdf和SPRUSG5A.pdf的介绍,这两个文档对硬件工程师、软件驱动工程师来说非常重要。

从盛夏走到深秋,我们继续DAVINCI DM365-DM368的开发。说来惭愧,人家51CTO热情支持本博客,而本人却一直没有像其他博客之星一样频繁更新博客,心里确实说不过去。管理公司确实很累,有更急的客户的项目要做,我们成功先推出了DM6446-810MHz的核心板( http://www.tongyetech.com ),期间深圳安防展也接见了几个其他市的客户,然后继续我们的DM368开发。

一、DM36X的BOOT过程介绍
DM36x的BOOT过程和DM6446、DM6467完全是一样的,因为都是ARM926EJS架构,里边都有一个RBL,这RBL在芯片出厂的时候都烧写在ROM里,芯片上电复位后RBL在运行,然后读取BOOT MODE引脚的电平状态,决定是从NAND FLASH还是从 MMC/SD、UART 、USB、 SPI、 EMAC、HPI中之一的方式BOOT,具体见SPRS558A.pdf和SPRUSG5A.pdf的介绍,这两个文档对硬件工程师、软件驱动工程师来说非常重要。


   本篇及以后的DM36X文章基本以DM368为主的介绍,因为DM365--- dvsdk_dm365_4_02_00_06和DM368----dvsdk_dm368_4_02_00_06的UBL,U-BOOT,KERNEL的源码完全是一样的,如果不考虑2A算法,DM368就是DM365的超频超出来的高清!
二、DM36X 的UBL移植
关于UBL的移植,本人打算单独写一篇文章的,但是UBL和UBOOT太紧密了,是TI davinci芯片的特点,所以放到一起讲。我们重点放在NAND BOOT的移植,这个UBL的版本是V1.50,在dvsdk_dm368_4_02_00_06\psp\flash-utils\DM36x和flash-utils\Common目录下,Common目录里有非常多东西,包括UBL的驱动源码、工具、脚本等等。我们主要关注arch,drivers,src,ubl。UBL的main()函数在dvsdk_dm368_4_02_00_06\psp\flash-utils\Common\ubl\src\ubl.c里,这几个文件夹打开看看就明白什么意思了,这里不罗嗦。
DM36x下有CCS、Common,GNU三个文件夹:
CCS文件夹:
这里边的程序需要在TI CCS下编译,通过仿真器和JTAG在DM36X的板子上调试和烧写NAND FLASH或NOR FLASH,有烧写Writer的应用程序,用CCS打开工程文件,会连接到dvsdk_dm368_4_02_00_06\psp\flash-utils\Common\ drivers里。
Common文件夹:Common里有核心的文件device.c和device_nand.c。device.c是最重要的文件,这里初始化很多系统的东西,见DEVICE_init():
1、屏蔽所有中断;
2、清除中断标志;
3、DEVICE_PSCInit(),Power and Sleep Controller;
4、主芯片管脚复用的设置DEVICE_pinmuxControl(),DM36X的管脚复用很多,很复杂,一共5个PINMUX寄存器需配置;
5、DEVICE_PLL1Init(),PPL1配置,见SPRUSG5A.pdf的35页开始的介绍,使用不同的频率的DM36X,这些值都不同,不过TI已经提供参数参考,我们的DM365核心板是:ARM297_DDR243_OSC24,DM368核心板是:ARM432_DDR340_OSC24;
6、DEVICE_PLL2Init(),PPL2的配置,使用同上,不同频率的值不同;
7、DEVICE_DDR2Init()的配置,市场上不同的DDR2内存芯片需要不同的参数配置,就在这个函数内。
8、DEVICE_EMIFInit(),这个针对NAND FLASH接口或NOR FLASH接口的访问时序配置;
9、DEVICE_UART0Init()的配置,这个就是我们调试DM36X串口的设置,我们使用UART0来调试LINUX,这里配置不好,后面的开发不用调试了。
10、DEVICE_TIMER0Init()定时器TIMER0的设置;
11、DEVICE_I2C0Init()的设置;
GNU的文件夹:
这个就是在LINUX环境下编译UBL的环境,修改dvsdk_dm368_4_02_00_06\psp\flash-utils\DM36x\GNU\ubl下的makefile,把
#$(MAKE) -C build TYPE=nor注释掉,只保留$(MAKE) -C build TYPE=nand,然后是make clean和 make生产ubl_DM36x_nand.bin的文件;
如果出现:device.c:(.text+0x2ec): undefined reference to `__aeabi_uidiv'和device.c:(.text+0x2e8): undefined reference to `__aeabi_uidivmod'的BUG,就是DDR_Get_Val()函数里边的除法和求余的语句和你的编译器不配置造成的。
result = ((parm * freq) / 10000) - 1;和if(((parm * freq) % 10000)),我们对参数的求值直接:
    tRFC = xxx; //DDR_Get_Val(DDR_T_RFC, DDR_FREQ);
    tRP = xxx; //DDR_Get_Val(DDR_T_RP, DDR_FREQ);
    tRCD = xxx; //DDR_Get_Val(DDR_T_RCD, DDR_FREQ);
    tWR = xxx; //DDR_Get_Val(DDR_T_WR, DDR_FREQ);
    tRAS = xxx; //DDR_Get_Val(DDR_T_RAS, DDR_FREQ);
    tRC = xxx; //DDR_Get_Val(DDR_T_RC, DDR_FREQ);
    tRRD = xxx; //DDR_Get_Val(DDR_T_RRD, DDR_FREQ);
    tWTR = xxx; //DDR_Get_Val(DDR_T_WTR, DDR_FREQ);
不用DDR_Get_Val()函数求值,这样就可以编译通过了。后来发觉TI的http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/p/115574/425950.aspx里也有人这人解决,呵呵,没想到本人的解决办法和一个网友一样的。本人记得调试三星2440UBOOT的时候,有人点到过,这里本人忘记在什么地方改了。
三、介绍u-boot-2010.12的特点
u-boot-2010.12的架构组织越来越向LINUX架构靠拢,这是U-BOOT的发展趋势。DM36x的UBOOT源码放在dvsdk_dm368_4_02_00_06\psp的下面,文件夹叫u-boot-2010.12-rc2-psp03.01.01.39,太长了,我们直接u-boot-2010.12。这个u-boot-2010.12支持YAFFS2、UBI等文件系统,支持SD卡、USB、VIDEO等驱动,支持lzma和lzo的内核镜像压缩,还有经典的linux shell命令支持模式,就是tab等的妙用,就是在”U-boot>”提示符下键入和LINUX 开发主机上一样的命令,当然这个命令很少,而且有些命令是用户自己加的。相对以前的u-boot-1.3.4版本等版本,这个新U-BOOT把很多平台的配置脚本给去掉了。
四、u-boot-2010.12的移植
DAVINCI芯片系列的UBOOT移植大同小异,比较简单。
1、首先修改:Makefile:
第140行:#examples/standalone \
第141行:#examples/api
第246行: #LIBS += api/libapi.o
等一下我们就可以把一些不相关的文件夹给删除掉,给u-boot-2010.12瘦身。
第323行:ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)u-boot.img
后面增加u-boot.img,这个u-boot.img就是我们要烧写到NAND里边的BIN文件,可以被UBL给BOOT起来的文件,因为u-boot.img是通过u-boot-2010.12\tools下的mkimage的工具生产的,带有头header的文件,这些头信息能被UBL给识别,所以才能烧写到NAND FLASH或NOR FLASH里边去。而u-boot.bin是没有增加文件头部信息的文件,不能被UBL直接给BOOT起来。u-boot.bin只能使用软件BOOT,比如: tftp 0x82080000u-boot.bin ;go 0x82080000。
最重要的地方修改:350行:-a$(CONFIG_SYS_TEXT_BASE) -e 0x81080000 \
或者-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE)\
刚开始这个-e 0是错误的,我们把U-BOOT-2010.12的entrypoint定义到0x81080000,这个DDR的地址是在u-boot-2010.12\board\davinci\dm365evm\config.mk
CONFIG_SYS_TEXT_BASE = 0x81080000
这个-e(entrypoint)不能是0,否则无法被UBL给BOOT起来。
第953行是不需要改动的:
davinci_dm365evm_config : unconfig
       @$(MKCONFIG) $(@:_config=) arm arm926ejs dm365evm davinci davinci
DM368也是使用同样的dm365evm名字。
2、开始删除一些不相关的文件夹
u-boot-2010.12\api文件夹
u-boot-2010.12\examples
u-boot-2010.12\nand_spl
u-boot-2010.12\onenand_ipl
u-boot-2010.12\arch\里的只保留arm文件夹
u-boot-2010.12\ arch\arm\cpu文件夹里,只保留arm926ejs
u-boot-2010.12\ arch\arm\cpu\arm926ejs文件夹里,只保留davinci文件夹,我们只删除文件夹,旁边的cpu.c和Makefile不要删除,等等;
u-boot-2010.12\board里边,只保留davinci文件夹,其他统统删除掉;
u-boot-2010.12\board\davinci\里,只保留dm365evm和common,其他删除;
u-boot-2010.12\include\configs里,只保留davinci_dm365evm.h,其他文件和文件夹删除掉;
通过上面的操作,我们的u-boot-2010.12简化多了。
3、修改最重要的davinci_dm365evm.h
在u-boot-2010.12\include\configs里,davinci_dm365evm.h
修改#define CONFIG_SYS_NAND_MAX_CHIPS    1,把以前的2改成1,表示本系统只支持1片NAND FLASH;
把#define CONFIG_BOOTCOMMAND      "if mmc rescan 0; then if fatload mmc 0 0x80600000 boot.scr; then source0x80600000; else fatload mmc 0 0x80700000 uImage; bootm 80700000; fi; fi"给注释掉,我们不想用SD卡保存内核的BIN文件uImage;
然后定义#define CONFIG_BOOTCOMMAND "run nand_boot",表示从NAND FLASH 读取内核;
修改UBOOT的BOOTARGS参数:#define CONFIG_BOOTARGS \
              "console=ttyS0,115200n8 mem=60M noinitrd rw ip=192.168.1.188:192.168.1.252:192.168.1.1:255.255.255.0root=/dev/nfs nfsroot=192.168.1.252:/home/davinci/dm368/dvsdk_dm368_4_02_00_06/filesystem/dm368rootfs,nolock"
我们这里提到mem=60M,是有根据的,我们板子是128M-BTYE,因为后面的DVSDK4.02里边的encodedecode等例子需要用到CMEM,这个和DM6446类似,所以定义为60M。
见dvsdk_dm368_4_02_00_06\filesystem\dvsdk-dm368-evm-rootfs解压后的etc\init.d\loadmodule-rc文件:
# Default DM368 EVM Memory Map
#
# Start Addr    Size    Description
# -------------------------------------------
# 0x00001000    32K     ARM TCM memory
# 0x80000000    48 MB   Linux
# 0x83000000    12 MB   Video driver memory (Linux)
# 0x83C00000    68 MB   CMEM
# 0x88000000    BOTTOM  ADDRESS
load () {
modprobe cmemk phys_start=0x83C00000 phys_end=0x88000000 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672 useHeapIfPoolUnavailable=1
modprobe irqk 
modprobe edmak
modprobe dm365mmap
mknod /dev/dm365mmap c `awk "\\$2==\"dm365mmap\"{print \\$1}" /proc/devices`0
}
有些人定义CMEM共享内存小一点的话,那么这个值可以比60M大。后面的参数就是使用静态固定IP的NFS SERVER路径,进行NFS调试;
增加
#define CONFIG_IPADDR       192.168.1.188
#define CONFIG_SERVERIP     192.168.1.252
#define CONFIG_ETHADDR       00:03:55:88:00:00
定义板子自己的IP和MAC,这个MAC在保证和其他网络设备MAC不冲突的前提下,自己调试的时候顺便分配。SERVERIP就是我们LINUX开发环境的主机IP地址,主要用做TFTP和NFS调试。
#define CONFIG_EXTRA_ENV_SETTINGS     \
"eraseenv=nand erase 0x00060000 0x00020000\0" \
"eraseall=nand erase 0x00000000 0x08000000\0" \
"updateuboot=tftp 0x84000000 dm368_uboot.bin;nand erase 80000 80000;nand write 84000000 80000 80000\0" \
"updatecore=tftp 0x84000000 dm368_kernel.bin;nand erase 0x00100000 0x00480000;nand write 84000000 100000 300000\0" \
"nand_boot=nboot 0x80700000 0 0x100000;bootm\0" \
"tftp_boot=tftpboot 0x80700000 dm368_kernel.bin;bootm\0"
这个很精典,我以前在DM6446上面U-BOOT-2009.03的移植上说过,在u-boot->的提示下,使用run 命令,就可以批量自动做一些操作。CONFIG_EXTRA_ENV_SETTINGS这个在u-boot-2010.12\common\env_common.c 和u-boot-2010.12\common\env_embedded.c有使用。你尽管在这里定义就可以了。
run eraseenv表示擦除u-boot的参数;
run eraseall表示擦除整片NAND;
run updateuboot表示通过TFTP烧写dm368_uboot.bin到板子上;
run updatecore表示烧写内核文件,300000表示内核BIN的大小,我们这里直接定死,3M的内核BIN文件长度够用了,当然,你可以根据内核大小的动态长度改变烧写方法;
TFTP先下载BIN文件(uImage)到DDR 的0x84000000地址,然后烧写到自己定义的分区上,这个和内核linux-2.6.32.17的分区是一一对应的,这点很重要;
"nand_boot=nboot 0x80700000 0 0x100000;bootm\0";内核放在NAND的0x100000,我们使用run nand_boot进行板级内核启动;
"tftp_boot=tftpboot 0x80700000 dm368_kernel.bin;bootm\0"使用TFTP进行内核软件启动,编译调试内核;
在run eraseenv中,我们使用0x00060000作为U-BOOT参数存放的偏移地址,长度使用128K-BYTE,所以在第183行处开始:
#ifdef CONFIG_NAND_DAVINCI
#define CONFIG_ENV_SIZE  (128 << 10) /* 128KiB */  //128K-byte for evn
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x00060000
#undef CONFIG_ENV_IS_IN_FLASH
#endif
顺便说一下,我们一般不建议在U-BOOT里边通过TFTP下载和烧写至少几十M的文件系统,我们尽量简化U-BOOT的功能,因为我们产品的重点是在LINUX内核,所有的开发、应用、升级程序都是基于LINUX内核上的,所以我们建议通过LINUX内核驱动来烧写文件系统,这是后话。
4、使能使用tab键功能
这个功能就是能在U-boot->的命令提示符下使用tab键,所以说
在davinci_dm365evm.h里一定要在“#define CONFIG_SYS_HUSH_PARSER”的上一行或下一行定义CONFIG_AUTO_COMPLETE;
在u-boot-2010.12\common\command.c里,第165行,把“#if 0”改成“#if 1”;
在u-boot-2010.12\common\env_common.c里,第247行把“#if 0”改成“#if 1”;
5、增加GPIO驱动的功能和修改一些BUG
   复位外围芯片,比如采用GPIO控制网口芯片复位,在u-boot-2010.12\board\davinci\dm365evm\dm365evm.c的board_init()函数,增加GPIO的复位驱动,对一些外围的芯片复位一下;
在u-boot-2010.12\common\cmd_nvedit.c里,第227行,把“((strcmp (name, "ethaddr") == 0)”用“(0”,这样就能任意修改保存在网口MAC地址ethaddr;
6、开始编译
    在u-boot-2010.12\arch\arm的config.mk里
#CROSS_COMPILE ?= arm-linux-
CROSS_COMPILE = arm-none-linux-gnueabi-
我们使用Code Sourcery ARM GCC Tool Chain的Sourcery G++ Lite 2009q1-203 for ARM GNU/Linux。
注意,除了UBL在UBL的文件夹内部编译外,其他的DVSDK的文件包u-boot,linux,dm365mm,irq ,edma,ceexamples,dmai,还有psp_examples,等等,都是在dvsdk_dm368_4_02_00_06的目录下编译,具体见dvsdk_dm368_4_02_00_06的Makefile。
u-boot的编译是:make u-boot,make u-boot_clean等等;
我们也可以在这个目录下自己生产一个build_uboot.sh的命令
#build u-boot in dvsdk4_02
make u-boot
chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img
cp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img /tftpboot/dm368_uboot.bin
或者再增加build_uboot_all.sh
#build u-boot in dvsdk4_02
make u-boot_clean
make u-boot
chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img
cp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img /tftpboot/dm368_uboot.bin
使用sh文件帮你做工,要多养成这样的习惯。
基本上,你的板子网口OK的话,可以通过TFTP把UBOOT烧进去吧,通过仿真器或者其他方式烧写,我们公司一般不用仿真器烧写,直接使用uart boot的方式烧写,自己写个uart boot的东西,好好看看dvsdk_dm368_4_02_00_06\psp\flash-utils的包里的东西,这里就保留吧。
   到这里,整个u-boot-2010.12移植基本完成。有不足的地方还需其他网友指正。本人维护两个主芯片平台后,变得非常忙,但本人会坚持写下去,下一篇是linux-2.6.32.17的移植,以前写过三篇有关UBOOT的文章,包括S3C2440,本人的目的让大家缩短开发这些BOOT开发的时间,因为重点的开发是在内核和基于内核的应用程序(信息产业部也大力支持开源的linux及相关技术),让大家的音视频网络产品快点出来,改善人民的生活,推进这个社会的文明,文明是靠科技来推动的,让那些丑陋的、麻木缺德的、文明倒退的野蛮行为、愚民手段、空洞扭曲、侮辱国人智商的事情尽快暴露出来,碰到棘手的问题也能暴露出来,毕竟广大人民的智慧是无穷无尽的,是完全有能力解决问题的。但前提是我们要有这样的科技学术氛围,身上没有极其沉重的衣食住行的枷锁,也没把绝大部分时间浪费在外语和XX课上(看看人家德国吧),所以我们要坚持我们的技术之路。文明是靠科技来推动的,而科技需要我们千千万万的科技人员踏踏实实去动手做事的。
   昨天才调试同TVP5158 D1的采集,终于看到图像了。心里很舒畅。顺便晒晒我们这段时间做的两款核心板:DM368和DM6446-810MHz核心板。核心板以最大限度方便客户进行功能扩展、集成应用,加快产品研发和上市,降低前期产品研发的风险。我们比较倾向项目合作,开发板不是我们开发的重点。


DM368核心板

DM368核心板硬件接口描述:
■板载存储器:
- 动态存储器(SDRAM DDR2):1Gb(128M-byte)
- 非易失存储器(NAND FLASH):1Gb(128M-byte)
■板载接口:
- 1个4位Boot模式选择接口
- 16-BIT YCC数字视频输入接口
- 2路可编程输出时钟CLOCK0和CLOCK2
- 1路模拟标清视频输出接口TVOUT
- 1路模拟高清视频输出接口YPbPr
- 1路麦克风差分输入接口
- 1路音频线性输出接口
- 1路喇叭差分输出 
- 3路AD采集接口
- 1个SD卡接口SD0
- 1个10/100M网络差分输入输出接口RX和TX
- 2个RS232串口(UART0,UART1) 
- 1个USB 2.0接口(HOST/DEVICE/OTG)
- 1个 SPI口SPI1 
- 1个标准 JTAG接口
- 1个4×4键盘接口
- 18个独立GPIO口
- 3路电源输入接口+1.8V,+3.3V,+1.2V
■单板尺寸:
46mm x 46mm x 9.5mm
其中整体高度是9.5mm


DM6446-810MHz核心板

DM6446-810MHz核心板采用的是TI TMD320DM6446BZWT8的双核芯片,ARM9的频率达到405MHz,DSP-C64+核的频率达到810MHz,DDR2-667操作频率配置为189MHz,NAND FLASH为128M-BYTE。集成10M/100M网络芯片在核心板上,方便客户设计底板,70mm*47mm,整体高度9mm,比名片更小。

桐烨科技DM6446-810MHz核心板支持硬件接口:
1、VPFE16位总线及H、V信号,完全可以接视频采集芯片和CMOS SENSOR;
2、VPBE引出RGB24的控制信号,便于接RGB24的LCD屏;
3、CVBS模拟视频输出;
4、网口信号及网口LED、LINK信号;
5、I2C接口;
6、SPI接口;
7、SD卡接口;
8、ATA硬盘接口;
9、USB2.0 HOST接口;
10、ASP音频接口;
11、3个UART接口;
12、18个独立GPIO接口及其他复用的GPIO接口;
13、JTAG仿真器接口;
14、3个PWM控制线;
15、CLK_OUT0和CLK_OUT1可编程时钟输出信号;

16、TI的H264  ENCODE   LIB达到720P(1280*720)的实时; 

   本篇及以后的DM36X文章基本以DM368为主的介绍,因为DM365--- dvsdk_dm365_4_02_00_06和DM368----dvsdk_dm368_4_02_00_06的UBL,U-BOOT,KERNEL的源码完全是一样的,如果不考虑2A算法,DM368就是DM365的超频超出来的高清!
二、DM36X 的UBL移植
关于UBL的移植,本人打算单独写一篇文章的,但是UBL和UBOOT太紧密了,是TI davinci芯片的特点,所以放到一起讲。我们重点放在NAND BOOT的移植,这个UBL的版本是V1.50,在dvsdk_dm368_4_02_00_06\psp\flash-utils\DM36x和flash-utils\Common目录下,Common目录里有非常多东西,包括UBL的驱动源码、工具、脚本等等。我们主要关注arch,drivers,src,ubl。UBL的main()函数在dvsdk_dm368_4_02_00_06\psp\flash-utils\Common\ubl\src\ubl.c里,这几个文件夹打开看看就明白什么意思了,这里不罗嗦。
DM36x下有CCS、Common,GNU三个文件夹:
CCS文件夹:
这里边的程序需要在TI CCS下编译,通过仿真器和JTAG在DM36X的板子上调试和烧写NAND FLASH或NOR FLASH,有烧写Writer的应用程序,用CCS打开工程文件,会连接到dvsdk_dm368_4_02_00_06\psp\flash-utils\Common\ drivers里。
Common文件夹:Common里有核心的文件device.c和device_nand.c。device.c是最重要的文件,这里初始化很多系统的东西,见DEVICE_init():
1、屏蔽所有中断;
2、清除中断标志;
3、DEVICE_PSCInit(),Power and Sleep Controller;
4、主芯片管脚复用的设置DEVICE_pinmuxControl(),DM36X的管脚复用很多,很复杂,一共5个PINMUX寄存器需配置;
5、DEVICE_PLL1Init(),PPL1配置,见SPRUSG5A.pdf的35页开始的介绍,使用不同的频率的DM36X,这些值都不同,不过TI已经提供参数参考,我们的DM365核心板是:ARM297_DDR243_OSC24,DM368核心板是:ARM432_DDR340_OSC24;
6、DEVICE_PLL2Init(),PPL2的配置,使用同上,不同频率的值不同;
7、DEVICE_DDR2Init()的配置,市场上不同的DDR2内存芯片需要不同的参数配置,就在这个函数内。
8、DEVICE_EMIFInit(),这个针对NAND FLASH接口或NOR FLASH接口的访问时序配置;
9、DEVICE_UART0Init()的配置,这个就是我们调试DM36X串口的设置,我们使用UART0来调试LINUX,这里配置不好,后面的开发不用调试了。
10、DEVICE_TIMER0Init()定时器TIMER0的设置;
11、DEVICE_I2C0Init()的设置;
GNU的文件夹:
这个就是在LINUX环境下编译UBL的环境,修改dvsdk_dm368_4_02_00_06\psp\flash-utils\DM36x\GNU\ubl下的makefile,把
#$(MAKE) -C build TYPE=nor注释掉,只保留$(MAKE) -C build TYPE=nand,然后是make clean和 make生产ubl_DM36x_nand.bin的文件;
如果出现:device.c:(.text+0x2ec): undefined reference to `__aeabi_uidiv'和device.c:(.text+0x2e8): undefined reference to `__aeabi_uidivmod'的BUG,就是DDR_Get_Val()函数里边的除法和求余的语句和你的编译器不配置造成的。
result = ((parm * freq) / 10000) - 1;和if(((parm * freq) % 10000)),我们对参数的求值直接:
    tRFC = xxx; //DDR_Get_Val(DDR_T_RFC, DDR_FREQ);
    tRP = xxx; //DDR_Get_Val(DDR_T_RP, DDR_FREQ);
    tRCD = xxx; //DDR_Get_Val(DDR_T_RCD, DDR_FREQ);
    tWR = xxx; //DDR_Get_Val(DDR_T_WR, DDR_FREQ);
    tRAS = xxx; //DDR_Get_Val(DDR_T_RAS, DDR_FREQ);
    tRC = xxx; //DDR_Get_Val(DDR_T_RC, DDR_FREQ);
    tRRD = xxx; //DDR_Get_Val(DDR_T_RRD, DDR_FREQ);
    tWTR = xxx; //DDR_Get_Val(DDR_T_WTR, DDR_FREQ);
不用DDR_Get_Val()函数求值,这样就可以编译通过了。后来发觉TI的http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/p/115574/425950.aspx里也有人这人解决,呵呵,没想到本人的解决办法和一个网友一样的。本人记得调试三星2440UBOOT的时候,有人点到过,这里本人忘记在什么地方改了。
三、介绍u-boot-2010.12的特点
u-boot-2010.12的架构组织越来越向LINUX架构靠拢,这是U-BOOT的发展趋势。DM36x的UBOOT源码放在dvsdk_dm368_4_02_00_06\psp的下面,文件夹叫u-boot-2010.12-rc2-psp03.01.01.39,太长了,我们直接u-boot-2010.12。这个u-boot-2010.12支持YAFFS2、UBI等文件系统,支持SD卡、USB、VIDEO等驱动,支持lzma和lzo的内核镜像压缩,还有经典的linux shell命令支持模式,就是tab等的妙用,就是在”U-boot>”提示符下键入和LINUX 开发主机上一样的命令,当然这个命令很少,而且有些命令是用户自己加的。相对以前的u-boot-1.3.4版本等版本,这个新U-BOOT把很多平台的配置脚本给去掉了。
四、u-boot-2010.12的移植
DAVINCI芯片系列的UBOOT移植大同小异,比较简单。
1、首先修改:Makefile:
第140行:#examples/standalone \
第141行:#examples/api
第246行: #LIBS += api/libapi.o
等一下我们就可以把一些不相关的文件夹给删除掉,给u-boot-2010.12瘦身。
第323行:ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)u-boot.img
后面增加u-boot.img,这个u-boot.img就是我们要烧写到NAND里边的BIN文件,可以被UBL给BOOT起来的文件,因为u-boot.img是通过u-boot-2010.12\tools下的mkimage的工具生产的,带有头header的文件,这些头信息能被UBL给识别,所以才能烧写到NAND FLASH或NOR FLASH里边去。而u-boot.bin是没有增加文件头部信息的文件,不能被UBL直接给BOOT起来。u-boot.bin只能使用软件BOOT,比如: tftp 0x82080000u-boot.bin ;go 0x82080000。
最重要的地方修改:350行:-a$(CONFIG_SYS_TEXT_BASE) -e 0x81080000 \
或者-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE)\
刚开始这个-e 0是错误的,我们把U-BOOT-2010.12的entrypoint定义到0x81080000,这个DDR的地址是在u-boot-2010.12\board\davinci\dm365evm\config.mk
CONFIG_SYS_TEXT_BASE = 0x81080000
这个-e(entrypoint)不能是0,否则无法被UBL给BOOT起来。
第953行是不需要改动的:
davinci_dm365evm_config : unconfig
       @$(MKCONFIG) $(@:_config=) arm arm926ejs dm365evm davinci davinci
DM368也是使用同样的dm365evm名字。
2、开始删除一些不相关的文件夹
u-boot-2010.12\api文件夹
u-boot-2010.12\examples
u-boot-2010.12\nand_spl
u-boot-2010.12\onenand_ipl
u-boot-2010.12\arch\里的只保留arm文件夹
u-boot-2010.12\ arch\arm\cpu文件夹里,只保留arm926ejs
u-boot-2010.12\ arch\arm\cpu\arm926ejs文件夹里,只保留davinci文件夹,我们只删除文件夹,旁边的cpu.c和Makefile不要删除,等等;
u-boot-2010.12\board里边,只保留davinci文件夹,其他统统删除掉;
u-boot-2010.12\board\davinci\里,只保留dm365evm和common,其他删除;
u-boot-2010.12\include\configs里,只保留davinci_dm365evm.h,其他文件和文件夹删除掉;
通过上面的操作,我们的u-boot-2010.12简化多了。
3、修改最重要的davinci_dm365evm.h
在u-boot-2010.12\include\configs里,davinci_dm365evm.h
修改#define CONFIG_SYS_NAND_MAX_CHIPS    1,把以前的2改成1,表示本系统只支持1片NAND FLASH;
把#define CONFIG_BOOTCOMMAND      "if mmc rescan 0; then if fatload mmc 0 0x80600000 boot.scr; then source0x80600000; else fatload mmc 0 0x80700000 uImage; bootm 80700000; fi; fi"给注释掉,我们不想用SD卡保存内核的BIN文件uImage;
然后定义#define CONFIG_BOOTCOMMAND "run nand_boot",表示从NAND FLASH 读取内核;
修改UBOOT的BOOTARGS参数:#define CONFIG_BOOTARGS \
              "console=ttyS0,115200n8 mem=60M noinitrd rw ip=192.168.1.188:192.168.1.252:192.168.1.1:255.255.255.0root=/dev/nfs nfsroot=192.168.1.252:/home/davinci/dm368/dvsdk_dm368_4_02_00_06/filesystem/dm368rootfs,nolock"
我们这里提到mem=60M,是有根据的,我们板子是128M-BTYE,因为后面的DVSDK4.02里边的encodedecode等例子需要用到CMEM,这个和DM6446类似,所以定义为60M。
见dvsdk_dm368_4_02_00_06\filesystem\dvsdk-dm368-evm-rootfs解压后的etc\init.d\loadmodule-rc文件:
# Default DM368 EVM Memory Map
#
# Start Addr    Size    Description
# -------------------------------------------
# 0x00001000    32K     ARM TCM memory
# 0x80000000    48 MB   Linux
# 0x83000000    12 MB   Video driver memory (Linux)
# 0x83C00000    68 MB   CMEM
# 0x88000000    BOTTOM  ADDRESS
load () {
modprobe cmemk phys_start=0x83C00000 phys_end=0x88000000 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672 useHeapIfPoolUnavailable=1
modprobe irqk 
modprobe edmak
modprobe dm365mmap
mknod /dev/dm365mmap c `awk "\\$2==\"dm365mmap\"{print \\$1}" /proc/devices`0
}
有些人定义CMEM共享内存小一点的话,那么这个值可以比60M大。后面的参数就是使用静态固定IP的NFS SERVER路径,进行NFS调试;
增加
#define CONFIG_IPADDR       192.168.1.188
#define CONFIG_SERVERIP     192.168.1.252
#define CONFIG_ETHADDR       00:03:55:88:00:00
定义板子自己的IP和MAC,这个MAC在保证和其他网络设备MAC不冲突的前提下,自己调试的时候顺便分配。SERVERIP就是我们LINUX开发环境的主机IP地址,主要用做TFTP和NFS调试。
#define CONFIG_EXTRA_ENV_SETTINGS     \
"eraseenv=nand erase 0x00060000 0x00020000\0" \
"eraseall=nand erase 0x00000000 0x08000000\0" \
"updateuboot=tftp 0x84000000 dm368_uboot.bin;nand erase 80000 80000;nand write 84000000 80000 80000\0" \
"updatecore=tftp 0x84000000 dm368_kernel.bin;nand erase 0x00100000 0x00480000;nand write 84000000 100000 300000\0" \
"nand_boot=nboot 0x80700000 0 0x100000;bootm\0" \
"tftp_boot=tftpboot 0x80700000 dm368_kernel.bin;bootm\0"
这个很精典,我以前在DM6446上面U-BOOT-2009.03的移植上说过,在u-boot->的提示下,使用run 命令,就可以批量自动做一些操作。CONFIG_EXTRA_ENV_SETTINGS这个在u-boot-2010.12\common\env_common.c 和u-boot-2010.12\common\env_embedded.c有使用。你尽管在这里定义就可以了。
run eraseenv表示擦除u-boot的参数;
run eraseall表示擦除整片NAND;
run updateuboot表示通过TFTP烧写dm368_uboot.bin到板子上;
run updatecore表示烧写内核文件,300000表示内核BIN的大小,我们这里直接定死,3M的内核BIN文件长度够用了,当然,你可以根据内核大小的动态长度改变烧写方法;
TFTP先下载BIN文件(uImage)到DDR 的0x84000000地址,然后烧写到自己定义的分区上,这个和内核linux-2.6.32.17的分区是一一对应的,这点很重要;
"nand_boot=nboot 0x80700000 0 0x100000;bootm\0";内核放在NAND的0x100000,我们使用run nand_boot进行板级内核启动;
"tftp_boot=tftpboot 0x80700000 dm368_kernel.bin;bootm\0"使用TFTP进行内核软件启动,编译调试内核;
在run eraseenv中,我们使用0x00060000作为U-BOOT参数存放的偏移地址,长度使用128K-BYTE,所以在第183行处开始:
#ifdef CONFIG_NAND_DAVINCI
#define CONFIG_ENV_SIZE  (128 << 10) /* 128KiB */  //128K-byte for evn
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x00060000
#undef CONFIG_ENV_IS_IN_FLASH
#endif
顺便说一下,我们一般不建议在U-BOOT里边通过TFTP下载和烧写至少几十M的文件系统,我们尽量简化U-BOOT的功能,因为我们产品的重点是在LINUX内核,所有的开发、应用、升级程序都是基于LINUX内核上的,所以我们建议通过LINUX内核驱动来烧写文件系统,这是后话。
4、使能使用tab键功能
这个功能就是能在U-boot->的命令提示符下使用tab键,所以说
在davinci_dm365evm.h里一定要在“#define CONFIG_SYS_HUSH_PARSER”的上一行或下一行定义CONFIG_AUTO_COMPLETE;
在u-boot-2010.12\common\command.c里,第165行,把“#if 0”改成“#if 1”;
在u-boot-2010.12\common\env_common.c里,第247行把“#if 0”改成“#if 1”;
5、增加GPIO驱动的功能和修改一些BUG
   复位外围芯片,比如采用GPIO控制网口芯片复位,在u-boot-2010.12\board\davinci\dm365evm\dm365evm.c的board_init()函数,增加GPIO的复位驱动,对一些外围的芯片复位一下;
在u-boot-2010.12\common\cmd_nvedit.c里,第227行,把“((strcmp (name, "ethaddr") == 0)”用“(0”,这样就能任意修改保存在网口MAC地址ethaddr;
6、开始编译
    在u-boot-2010.12\arch\arm的config.mk里
#CROSS_COMPILE ?= arm-linux-
CROSS_COMPILE = arm-none-linux-gnueabi-
我们使用Code Sourcery ARM GCC Tool Chain的Sourcery G++ Lite 2009q1-203 for ARM GNU/Linux。
注意,除了UBL在UBL的文件夹内部编译外,其他的DVSDK的文件包u-boot,linux,dm365mm,irq ,edma,ceexamples,dmai,还有psp_examples,等等,都是在dvsdk_dm368_4_02_00_06的目录下编译,具体见dvsdk_dm368_4_02_00_06的Makefile。
u-boot的编译是:make u-boot,make u-boot_clean等等;
我们也可以在这个目录下自己生产一个build_uboot.sh的命令
#build u-boot in dvsdk4_02
make u-boot
chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img
cp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img /tftpboot/dm368_uboot.bin
或者再增加build_uboot_all.sh
#build u-boot in dvsdk4_02
make u-boot_clean
make u-boot
chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img
cp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img /tftpboot/dm368_uboot.bin
使用sh文件帮你做工,要多养成这样的习惯。
基本上,你的板子网口OK的话,可以通过TFTP把UBOOT烧进去吧,通过仿真器或者其他方式烧写,我们公司一般不用仿真器烧写,直接使用uart boot的方式烧写,自己写个uart boot的东西,好好看看dvsdk_dm368_4_02_00_06\psp\flash-utils的包里的东西,这里就保留吧。
   到这里,整个u-boot-2010.12移植基本完成。有不足的地方还需其他网友指正。本人维护两个主芯片平台后,变得非常忙,但本人会坚持写下去,下一篇是linux-2.6.32.17的移植,以前写过三篇有关UBOOT的文章,包括S3C2440,本人的目的让大家缩短开发这些BOOT开发的时间,因为重点的开发是在内核和基于内核的应用程序(信息产业部也大力支持开源的linux及相关技术),让大家的音视频网络产品快点出来,改善人民的生活,推进这个社会的文明,文明是靠科技来推动的,让那些丑陋的、麻木缺德的、文明倒退的野蛮行为、愚民手段、空洞扭曲、侮辱国人智商的事情尽快暴露出来,碰到棘手的问题也能暴露出来,毕竟广大人民的智慧是无穷无尽的,是完全有能力解决问题的。但前提是我们要有这样的科技学术氛围,身上没有极其沉重的衣食住行的枷锁,也没把绝大部分时间浪费在外语和XX课上(看看人家德国吧),所以我们要坚持我们的技术之路。文明是靠科技来推动的,而科技需要我们千千万万的科技人员踏踏实实去动手做事的。
   昨天才调试同TVP5158 D1的采集,终于看到图像了。心里很舒畅。顺便晒晒我们这段时间做的两款核心板:DM368和DM6446-810MHz核心板。核心板以最大限度方便客户进行功能扩展、集成应用,加快产品研发和上市,降低前期产品研发的风险。我们比较倾向项目合作,开发板不是我们开发的重点。

 

DM368核心板

DM368核心板硬件接口描述:
■板载存储器:
- 动态存储器(SDRAM DDR2):1Gb(128M-byte)
- 非易失存储器(NAND FLASH):1Gb(128M-byte)
■板载接口:
- 1个4位Boot模式选择接口
- 16-BIT YCC数字视频输入接口
- 2路可编程输出时钟CLOCK0和CLOCK2
- 1路模拟标清视频输出接口TVOUT
- 1路模拟高清视频输出接口YPbPr
- 1路麦克风差分输入接口
- 1路音频线性输出接口
- 1路喇叭差分输出 
- 3路AD采集接口
- 1个SD卡接口SD0
- 1个10/100M网络差分输入输出接口RX和TX
- 2个RS232串口(UART0,UART1) 
- 1个USB 2.0接口(HOST/DEVICE/OTG)
- 1个 SPI口SPI1 
- 1个标准 JTAG接口
- 1个4×4键盘接口
- 18个独立GPIO口
- 3路电源输入接口+1.8V,+3.3V,+1.2V
■单板尺寸:
46mm x 46mm x 9.5mm
其中整体高度是9.5mm

 

DM6446-810MHz核心板

DM6446-810MHz核心板采用的是TI TMD320DM6446BZWT8的双核芯片,ARM9的频率达到405MHz,DSP-C64+核的频率达到810MHz,DDR2-667操作频率配置为189MHz,NAND FLASH为128M-BYTE。集成10M/100M网络芯片在核心板上,方便客户设计底板,70mm*47mm,整体高度9mm,比名片更小。

桐烨科技DM6446-810MHz核心板支持硬件接口:
1、VPFE16位总线及H、V信号,完全可以接视频采集芯片和CMOS SENSOR;
2、VPBE引出RGB24的控制信号,便于接RGB24的LCD屏;
3、CVBS模拟视频输出;
4、网口信号及网口LED、LINK信号;
5、I2C接口;
6、SPI接口;
7、SD卡接口;
8、ATA硬盘接口;
9、USB2.0 HOST接口;
10、ASP音频接口;
11、3个UART接口;
12、18个独立GPIO接口及其他复用的GPIO接口;
13、JTAG仿真器接口;
14、3个PWM控制线;
15、CLK_OUT0和CLK_OUT1可编程时钟输出信号;

16、TI的H264  ENCODE   LIB达到720P(1280*720)的实时;

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Yahoo的Yslow23条规则

    一. CONTENT减少使用HTTP请求(Minimize HTTP Requests) 通常打开一个页面的时候,大部分的时间都是在下载该页面的图片,css样式,js脚本,flash等等资源,减少这些资源的组件数,能够减少http请求,所以可以导致页面的访问速度变快. 减少DNS查找(Reduce DNS Lookups) 通常在访问一个…...

    2024/4/13 13:05:24
  2. Layui 的 formSelects-v4 选择框 城市选择使用

    下载 js 和 css 分别放在 layui/lay/modules 下 , layui/css/modules formSelects-v4 下 html <div><select name="province" id="province" class="form-control"><option value="100000">全国</option>&…...

    2024/4/28 1:08:03
  3. 网络规划设计师教程pdf版下载

    2009-07-10 17:20 [url=http://club.topsage.com/thread-353609-1-1.html][b]下载地址[/b][/url][b]1 [/b][url=thunder://QUFmdHA6Ly8yMjEuMjM4LjE5NS4zL3VwbG9hZHMvY29tcHV0ZXIvcmsvzfjC57nmu67J6LzGyqa9zLPMW3d3dy5Ub3BTYWdlLmNvbV0uemlwWlo=][b]…...

    2024/4/25 14:20:42
  4. QT多线程编程

    一、线程基础1、GUI线程与工作线程每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。2、数据的同步访问每个线程都有自己的栈,因此每个线程都要…...

    2024/4/14 1:14:32
  5. DaVinci Resolve 12 Essential Training DaVinci Resolve12基本培训 Lynda课程中文字幕

    DaVinci Resolve 12 Essential Training 中文字幕 DaVinci Resolve12基本培训 中文字幕DaVinci Resolve 12 Essential Training 十多年来,DaVinci Resolve一直是为好莱坞电影,广告和专业企业视频工作的调色师的首选工具 现在,Mac或PC上的任何人都可以使用它 最新版本DaVinci…...

    2024/4/15 15:22:55
  6. SpringBoot+Shiro+MybatisPlus+Layui实现的后台管理系统

    项目地址 Yorkmass觉得有帮助就去点个Star啊!点击预览B站视频讲解通用后台管理系统主要技术springbootshiromybatisPluslayui 实现功能菜单管理权限管理用户管理角色管理部门管理缓存管理日志管理数据库管理--使用druid发布公告 环境数据库mysql 5.6 示例和使用所有用户初始密…...

    2024/4/12 16:47:12
  7. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十三)制作游戏主菜单面板及鼠标左右键快捷技能栏...

    每款MMORPG都有一个主菜单,通常置于窗口的底部。游戏中主角大部分的设置操作都从这里开启。如人物属性、物品(包裹)、技能、任务、队伍、地图、家族、门派、商城、系统设置等等;当然,还包括快捷自定义菜单栏,以及类似《暗黑破坏神》中经典式的左右键快捷技能栏。这些内容…...

    2024/4/12 11:59:58
  8. Java Web研发工程师新手入门指南

    本文简要介绍了作为一名Java Web研发工程师,需要具备的一些主要技能和常用的工具,有志于从事该工作的新手可以做一个参考。一、基础工具篇常用IDE:IntelliJ IDEA、Eclipse或者MyEclipse 这三种IDE都是比较常用的集成开发环境,本人也都使用过,其中Eclipse和MyEclipse之间差…...

    2024/4/27 22:40:32
  9. QT 多线程应用

    QT多线程的实现有两种方法,一种是继承QThread的多线程使用方法,另外一种是使用QObject实现多线的方法。传统的方式是继承QTread,但是这种方式比较的容易出错,QT官方推荐使用的是第二种方式。这里介绍这两种方式的最简单的一种创建方式。最简方法一:(1)创建一个QT应用(2…...

    2024/4/28 2:31:00
  10. 【Web优化】Yslow优化法则(一)最小化HTTP请求数

    原文:http://blog.csdn.net/ohmygirl/article/details/23948655 http://wenku.baidu.com/link?url=qu4WGHW8EUQmzA8xem66RTTLmNZzMymG02K4gexgeDaBVMclDQ5PjgspV8VjO_SBThUuQYkPcrG3NylyYVN01RIz6xe7zfOsq2mlv7kBtxS Yahoo提出的前端优化的最佳实践,称为YSLOW优化法则。主要…...

    2024/4/28 6:01:41
  11. 基于layui的框架模版,采用模块化设计,接口分离,组件化思想

    代码地址如下:http://www.demodashi.com/demo/13362.html1. 准备工作编辑器vscode,需要安装liveServer插件在前端开启静态服务器 或者使用hbuilder的自带服务器概述由于公司业务比较复杂,并且有很多重复性的功能,所以尽量采用高可复用的原则,该系统采用完全分离的开发方式…...

    2024/4/13 5:23:06
  12. Davinci-二次开发系列01:开篇

    概述 Davinci 是宜信出品的DVaaS(数据可视化及服务)的一款BI产品,翻译过来是达芬奇,达芬奇大家都知道著名画家,代表作有《蒙娜丽莎》。所以通过名字就能看出来宜信对着产品的厚望,颇有一种想要成为大师的意思。 百度搜Davinci会搜出DaVinci Resolve这款不知道你知不知道的…...

    2024/4/12 17:43:56
  13. Qt两种多线程创建方式及用途

    QThread 使用探讨2010-10-23 00:30注意:本文停止更新,请优先考虑 Qt 线程基础(QThread、QtConcurrent等)dbzhang800 2011.06.18QThread 似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用 QThread,随便用goog…...

    2024/4/28 8:36:34
  14. 完整实现地宫地图

    地宫说明我们看到的游戏地宫有如暗黑的地下城风格,泰瑞利亚的地道风格,苍之纪元和冒险岛的走格子风格。东方故事的深渊探险风格,这里了结合苍之纪元+深渊探险实现一套地宫副本的基础结构;与其走格子不同的是,地宫是触屏点击行走,当然ARPG的寻路实现走格子便不屑一谈了。我…...

    2024/4/12 5:00:34
  15. 加快网站访问速度——Yslow极限优化

    为什么80%的码农都做不了架构师?>>> Yslow是一套雅虎的网页评分系统,详细的列出了各项影响网页载入速度的参数,这里不做多说。 我之前就一直参考Yslow做博客优化,经过长时间的学习也算是有所收获,小博的YslowV2分数达到了94分(偶耶!),如果换用博客类小网站…...

    2024/4/12 5:01:10
  16. 软件工程师 VS 硬件工程师

    关于软件工程师和硬件工程师总有太多的话题。以下内容虽然是学生写的,但是还是能说明问题的:我个人理解的就业与行业前景01因为我个人对美国这方面了解更多,就先从美国说一说。我相信硬件工程师和软件工程师的就业前景应该是提这个问题的人最想知道的方面。就我所了解的,在…...

    2024/4/12 5:00:28
  17. Angular5采用layui前端UI框架,trigger模拟change事件不能触发ngModel数据更新的解决方案

    本教程适用于所有符合情况的第三方UI框架; 如果你想在Angular中使用Layui框架,想必已经发现Layui已经用div+css重写了select、radio、CheckBox等表单元素的样式,原元素被display="none"隐藏掉了。 那么问题来了,用户操作的是layui重写的元素视图上面,Angular的[…...

    2024/4/12 5:01:10
  18. QT学习---使用多线程的两种方法(子类化QThread+子类化QObject)

    第一种方法:摘要Qt多线程方法1 继承QThread1写一个继承于QThread的线程2 QThread的几个函数quitexitterminate函数3 正确的终止一个线程4 如何正确启动一个线程41正确的启动一个全局线程和UI一直存在的线程42 如何启动一个局部线程用完即释放的线程继承QThread的一些总结使用Q…...

    2024/4/15 9:52:21
  19. Eclipse 4.9 正式发布,支持 Java 11

    转载自 Eclipse 4.9 正式发布,支持 Java 11来看看 Eclipse 4.9 带来了哪些新特性!1、外观新增类似大纲视图的”Minimap”间主题/暗黑主题,启用方法:Window > Show View > Other,然后在 Show View 对话框中选择 General > Minimap或在 Quick Access 搜索框输入 “…...

    2024/4/12 5:00:34
  20. 无忧发卡系统_发卡网_阿洋发卡网_layui发卡网

    无忧发卡系统_发卡网_阿洋发卡网 2019年最新发卡网layui框架带安装教程视频 【1】美化后台界面! 【2】增加hack易支付接口,abc易支付接口,码支付接口! 【3】pc/wap完美自适应无bug 【4】安装界面layui框架美化完成 【5】支持QQ/支付宝/wx/三种支付接口方式 【6】前台模板后续…...

    2024/4/15 14:09:21

最新文章

  1. Python爬虫--用户代理池

    用户代理池的作用就是模拟不同用户请求&#xff0c; 防止被屏蔽。 用户代理池&#xff1a; 这个池子也很简单&#xff0c; 就是多准备一些 ua 头就好了 废话不多说&#xff0c;先来简单的看看 import urllib.request import randomuapool ["Mozilla/5.0 (Windows NT 6…...

    2024/4/28 12:06:35
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 北航2023年考研机试题

    【问题描述】一共6个手机基站&#xff0c;具有记录手机连接基站的能力&#xff0c;6个手机基站分别为ABCDEF&#xff0c;他们具有自己的覆盖范围且任何两个基站的覆盖范围不想交&#xff0c;基站保存的手机登陆日志包括手机号&#xff08;11位&#xff0c;用字符串保存&#xf…...

    2024/4/23 6:26:10
  4. 手机无线投屏到windows11电脑

    1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...

    2024/4/26 12:46:48
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57