行情
HOME
行情
正文内容
Nand分区全ff 「正点原子Linux连载」第三十三章U-Boot移植(一)
发布时间 : 2024-11-25
作者 : 小编
访问数量 : 23
扫码分享至微信

「正点原子Linux连载」第三十三章U-Boot移植(一)

1)实验平台:正点原子Linux开发板

2)摘自《正点原子 I.MX6U嵌入式Linux驱动开发指南 关注官方微信号公众号,获取更多资料:正点原子

第三十三章U-Boot移植

上一章节我们详细的分析了uboot的启动流程,对uboot有了一个初步的了解。前两章我们都是使用的正点原子提供的uboot,本章我们就来学习如何将NXP官方的uboot移植到正点原子的I.MX6ULL开发板上,学习如何在uboot中添加我们自己的板子。

33.1 NXP官方开发板uboot编译测试

33.1.1 查找NXP官方的开发板默认配置文件

uboot的移植并不是说我们完完全全的从零开始将uboot移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将uboot移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习STM32的时候听说过的discover开发板就是ST自己做的。半导体厂商会将uboot移植到他们自己的原厂开发板上,测试好以后就会将这个uboot发布出去,这就是大家常说的原厂BSP包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的BSP包上做修改,将uboot或者linuxkernel移植到我们的硬件上。这个就是uboot移植的一般流程:

①、在uboot中找到参考的开发平台,一般是原厂的开发板。

②、参考原厂开发板移植uboot到我们所使用的开发板上。

正点原子的I.MX6ULL开发板参考的是NXP官方的I.MX6ULL EVK开发板做的硬件,因此我们在移植uboot的时候就可以以NXP官方的I.MX6ULL EVK开发板为蓝本。

本章我们是将NXP官方的uboot移植到正点原子的I.MX6ULL开发板上,NXP官方的uboot放到了开发板光盘中,路径为:1、例程源码->4、NXP官方原版Uboot和Linux->uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。将uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2发送到Ubuntu中并解压,然后创建VSCode工程。

在移植之前,我们先编译一下NXP官方I.MX6ULL EVK开发板对应的uboot,首先是配置uboot,configs目录下有很多跟I.MX6UL/6ULL有关的配置如图33.1.1.1所示,

图33.1.1.1 NXP官方I.MX6UL/6ULL默认配置文件

从图33.1.1.1可以看出有很多的默认配置文件,其中以mx6ul开头的是I.MX6UL芯片的,mx6ull开头的是I.MX6ULL开发板的。I.MX6UL/6ULL有9x9mm和14x14mm两种尺寸的,所以我们可以看到会有mx6ull_9x9和mx6ull_14x14开头的默认配置文件。我们使用的是14x14mm的芯片,所以关注mx6ull_14x14开头的默认配置文件。正点原子的I.MX6ULL有EMMC和NAND两个版本的,因此我们最终只需要关注mx6ull_14x14_evk_emmc_defconfig和mx6ull_14x14_evk_nand_defconfig这两个配置文件就行了。本章我们讲解EMMC版本的移植(NAND版本移植很多类似),所以使用mx6ull_14x14_evk_emmc_defconfig作为默认配置文件。

33.1.2 编译NXP官方开发板对应的uboot

找到NXP官方I.MX6ULL EVK开发板对应的默认配置文件以后就可以编译一下,使用如下命令编译uboot:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig

make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

编译完成以后结果如图33.1.2.1所示:

图33.1.2.1 编译结果

从图33.1.2.1可以看出,编译成功。我们在编译的时候需要输入ARCH和CORSS_COMPILE这两个变量的值,这样太麻烦了。我们可以直接在顶层Makefile中直接给ARCH和CORSS_COMPILE赋值,修改如图33.1.2.2所示:

图33.1.2.2 添加ARCH和CROSS_COMPILE值

图33.1.2.2中的250、251行就是直接给ARCH和CROSS_COMPILE赋值,这样我们就可以使用如下简短的命令来编译uboot了:

make mx6ull_14x14_evk_emmc_defconfig

make V=1 -j16

如果既不想修改uboot的顶层Makefile,又想编译的时候不用输入那么多,那么就直接创建个shell脚本就行了,shell脚本名为mx6ull_14x14_emmc.sh,然后在shell脚本里面输入如下内容:

示例代码33.1.2.1 mx6ull_14x14_emmc.sh文件

1 #!/bin/bash

2 make ARCH= arm CROSS_COMPILE= arm- linux- gnueabihf- distclean

3 make ARCH= arm CROSS_COMPILE= arm- linux- gnueabihf- mx6ull_14x14_evk_emmc_defconfig

4 make V= 1 ARCH= arm CROSS_COMPILE= arm- linux- gnueabihf-- j16

记得给mx6ull_14x14_emmc.sh这个文件可执行权限,使用mx6ull_14x14_emmc.sh脚本编译uboot的时候每次都会清理一下工程,然后全部重新编译,编译的时候直接执行这个脚本就行了,命令如下:

./mx6ull_14x14_evk_emmc.sh

编译完成以后会生成u-boot.bin、u-boot.imx等文件,但是这些文件是NXP官方I.MX6ULL EVK开饭。能不能用到正点原子的I.MX6ULL开发板上呢?试一下不就知道了!

33.1.3 烧写验证与驱动测试

将imxdownload软件拷贝到uboot源码根目录下,然后使用imxdownload软件将u-boot.bin烧写到SD卡中,烧写命令如下:

chmod 777 imxdownload //给予imxdownload可执行权限

./imxdownload u-boot.bin /dev/sdg //烧写u-boot.bin到SD卡中

烧写完成以后将SD卡插入I.MX6U-ALPHA开发板的TF卡槽中,最后设置开发板从SD卡启动。打开SecureCRT,设置好开发板所使用的串口并打开,复位开发板,SecureCRT接收到如下图33.1.3.1所示信息:

图33.1.3.1 uboot启动信息

从图33.1.3.1可以看出,uboot启动正常,虽然我们用的是NXP官方I.MX6ULL开发板的uboot,但是在正点原子的I.MX6ULL开发板上是可以正常启动的。而且DRAM识别正确,为512MB,如果用的NAND版本的核心版的话uboot启动会失败!因为NAND核心版用的256MB的DRAM。

1、SD卡和EMMC驱动检查

检查一下SD卡和EMMC驱动是否正常,使用命令mmclist列出当前的MMC设备,结果如图33.1.3.2所示:

图33.1.3.2 emmc设备检查

从图33.1.3.2可以看出当前有两个MMC设备,检查每个MMC设备信息,先检查MMC设备0,输入如下命令:

mmcdev 0

mmcinfo

结果如图33.1.3.3所示:

图33.1.3.3 mmc设备0信息

从图33.1.3.3可以看出,mmc设备0是SD卡,SD卡容量为14.8GB,这个和我所使用的SD卡信息相符,说明SD卡驱动正常。再来检查MMC设备1,输入如下命令:

mmcdev 1

mmcinfo

结果如图33.1.3.4所示:

图33.1.3.4 mmc设备1信息

从图33.1.3.4可以看出,mmc设备1为EMMC,容量为3.6GB,说明EMMC驱动也成功,SD卡和EMMC的驱动都没问题。

2、LCD驱动检查

如果uboot中的LCD驱动正确的话,启动uboot以后LCD上应该会显示出NXP的logo,如下图33.1.3.5所示:

图33.1.3.5 uboot LCD界面

如果你用的不是正点原子的4.3寸480x272分辨率的屏幕的话,那么LCD就不会显示33.1.3.5所示logo界面。因为NXP官方I.MX6ULL开发板的屏幕就是4.3寸480x272分辨率的,所以uboot默认LCD驱动是4.3寸480x272分辨率的。如果使用其他分辨率的LCD就需要修改LCD驱动,这里我们先不修改LCD驱动了,稍后我们在讲解如何修改uboot中的LCD驱动,我们只需要记得,uboot的LCD需要修改就行了。

3、网络驱动

uboot启动的时候提示"Board Net Initialization Failed"和"No ethernet found."这两行,说明网络驱动也有问题,正常情况下应该是如图33.1.3.6所示提示:

图33.1.3.6 网络信息

现在没有图33.1.3.6中的信息,那更别说ping一下ubuntu主机了,说明当前uboot的网络部驱动也是有问题的,这是因为正点原子开发板的网络芯片复位引脚和NXP官方开发板不一样,因此需要修改驱动。

总结一下NXP官方I.MX6ULL EVK开发板的uboot在正点原子EMMC版本I.MX6ULL 开发板上的运行情况:

①、uboot启动正常,DRAM识别正确,SD卡和EMMC驱动正常。

②、uboot里面的LCD驱动默认是给4.3寸480x272分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。

②、网络不能工作,识别不出来网络信息,需要修改驱动。

接下来我们要做的工作如下:

①、前面我们一直使用着uboot中NXP官方开发板的配置,接下来需要在uboot中添加我们自己的开发板,也就是正点原子的I.MX6ULL开发板。

②、解决LCD驱动和网络驱动的问题。

33.2 在U-Boot中添加自己的开发板

NXP官方uboot中默认都是NXP自己的开发板,虽说我们可以直接在官方的开发板上直接修改,使uboot可以完整的运行在我们的板子上。但是从学习的角度来讲,这样我们就不能了解到uboot是如何添加新平台的。接下来我们就参考NXP官方的I.MX6ULL EVK开发板,学习如何在uboot中添加我们的开发板或者开发平台。

33.2.1 添加开发板默认配置文件

先在configs目录下创建默认配置文件,复制mx6ull_14x14_evk_emmc_defconfig,然后重命名为mx6ull_alientek_emmc_defconfig,命令如下:

cd configs

cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig

然后将文件mx6ull_alientek_emmc_defconfig中的内容改成下面的:

示例代码33.2.1.1 mx6ull_alientek_emmc_defconfig文件

1 CONFIG_SYS_EXTRA_OPTIONS= "IMX_CONFIG=board/freescale/mx6ull_alientek_

emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"

2 CONFIG_ARM= y

3 CONFIG_ARCH_MX6= y

4 CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC= y

5 CONFIG_CMD_GPIO= y

可以看出,mx6ull_alientek_emmc_defconfig基本和mx6ull_14x14_evk_emmc_defconfig中的内容一样,只是第1行和第4行做了修改。

33.2.2 添加开发板对应的头文件

在目录include/configs下添加I.MX6ULL-ALPHA开发板对应的头文件,复制include/configs/mx6ullevk.h,并重命名为mx6ull_alientek_emmc.h,命令如下:

cp include/configs/mx6ullevk.h mx6ull_alientek_emmc.h

拷贝完成以后将:

#ifndef __MX6ULLEVK_CONFIG_H

#define __MX6ULLEVK_CONFIG_H

改为:

#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H

#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

mx6ull_alientek_emmc.h里面有很多宏定义,这些宏定义基本用于配置uboot,也有一些I.MX6ULL的配置项目。如果我们自己要想使能或者禁止uboot的某些功能,那就在mx6ull_alientek_emmc.h里面做修改即可。mx6ull_alientek_emmc.h里面的内容比较多,去掉一些用不到的配置,精简后的内容如下:

示例代码33.2.2.1 mx6ull_alientek_emmc.h文件

1/*

2 * Copyright (C) 2016 Freescale Semiconductor, Inc.

3 *

4 * Configuration settings for the Freescale i.MX6UL 14x14 EVK board.

5 *

6 * SPDX-License-Identifier: GPL-2.0+

7 */

8 #ifndef __MX6ULL_ALEITENK_EMMC_CONFIG_H

9 #define __MX6ULL_ALEITENK_EMMC_CONFIG_H

10

11

12 #include < asm/ arch/ imx- regs. h>

13 #include < linux/ sizes. h>

14 #include "mx6_common.h"

15 #include < asm/ imx- common/ gpio. h>

16

......

28

29 #define is_mx6ull_9x9_evk() CONFIG_IS_ENABLED( TARGET_MX6ULL_9X9_EVK)

30

31 #ifdef CONFIG_TARGET_MX6ULL_9X9_EVK

32 #define PHYS_SDRAM_SIZE SZ_256M

33 #define CONFIG_BOOTARGS_CMA_SIZE "cma=96M "

34 #else

35 #define PHYS_SDRAM_SIZE SZ_512M

36 #define CONFIG_BOOTARGS_CMA_SIZE ""

37/* DCDC used on 14x14 EVK, no PMIC */

38 #undef CONFIG_LDO_BYPASS_CHECK

39 #endif

40

41/* SPL options */

42/* We default not support SPL

43 * #define CONFIG_SPL_LIBCOMMON_SUPPORT

44 * #define CONFIG_SPL_MMC_SUPPORT

45 * #include "imx6_spl.h"

46 */

47

48 #define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG

49

50 #define CONFIG_DISPLAY_CPUINFO

51 #define CONFIG_DISPLAY_BOARDINFO

52

53/* Size of malloc() pool */

54 #define CONFIG_SYS_MALLOC_LEN ( 16* SZ_1M)

55

56 #define CONFIG_BOARD_EARLY_INIT_F

57 #define CONFIG_BOARD_LATE_INIT

58

59 #define CONFIG_MXC_UART

60 #define CONFIG_MXC_UART_BASE UART1_BASE

61

62/* MMC Configs */

63 #ifdef CONFIG_FSL_USDHC

64 #define CONFIG_SYS_FSL_ESDHC_ADDR USDHC2_BASE_ADDR

65

66/* NAND pin conflicts with usdhc2 */

67 #ifdef CONFIG_SYS_USE_NAND

68 #define CONFIG_SYS_FSL_USDHC_NUM 1

69 #else

70 #define CONFIG_SYS_FSL_USDHC_NUM 2

71 #endif

72 #endif

73

74/* I2C configs */

75 #define CONFIG_CMD_I2C

76 #ifdef CONFIG_CMD_I2C

77 #define CONFIG_SYS_I2C

78 #define CONFIG_SYS_I2C_MXC

79 #define CONFIG_SYS_I2C_MXC_I2C1 /* enable I2C bus 1 */

80 #define CONFIG_SYS_I2C_MXC_I2C2 /* enable I2C bus 2 */

81 #define CONFIG_SYS_I2C_SPEED 100000

82

......

89

90 #define CONFIG_SYS_MMC_IMG_LOAD_PART 1

91

92 #ifdef CONFIG_SYS_BOOT_NAND

93 #define CONFIG_MFG_NAND_PARTITION "mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "

94 #else

95 #define CONFIG_MFG_NAND_PARTITION ""

96 #endif

97

98 #define CONFIG_MFG_ENV_SETTINGS \

99"mfgtool_args=setenv bootargs console=${console},${baudrate} " \

......

111"bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \

112

113 #if defined( CONFIG_SYS_BOOT_NAND)

114 #define CONFIG_EXTRA_ENV_SETTINGS \

115 CONFIG_MFG_ENV_SETTINGS \

116"panel=TFT43AB\0" \

......

126"bootz ${loadaddr} - ${fdt_addr}\0"

127

128 #else

129 #define CONFIG_EXTRA_ENV_SETTINGS \

130 CONFIG_MFG_ENV_SETTINGS \

131"script=boot.scr\0" \

......

202"fi;\0" \

203

204 #define CONFIG_BOOTCOMMAND \

205"run findfdt;" \

......

216"else run netboot; fi"

217 #endif

218

219/* Miscellaneous configurable options */

220 #define CONFIG_CMD_MEMTEST

221 #define CONFIG_SYS_MEMTEST_START 0x80000000

222 #define CONFIG_SYS_MEMTEST_END ( CONFIG_SYS_MEMTEST_START + 0x8000000)

223

224 #define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR

225 #define CONFIG_SYS_HZ 1000

226

227 #define CONFIG_STACKSIZE SZ_128K

228

229/* Physical Memory Map */

230 #define CONFIG_NR_DRAM_BANKS 1

231 #define PHYS_SDRAM MMDC0_ARB_BASE_ADDR

232

233 #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM

234 #define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR

235 #define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE

236

237 #define CONFIG_SYS_INIT_SP_OFFSET \

238( CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)

239 #define CONFIG_SYS_INIT_SP_ADDR \

240( CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)

241

242/* FLASH and environment organization */

243 #define CONFIG_SYS_NO_FLASH

244

......

255

256 #define CONFIG_SYS_MMC_ENV_DEV 1/* USDHC2 */

257 #define CONFIG_SYS_MMC_ENV_PART 0/* user area */

258 #define CONFIG_MMCROOT "/dev/mmcblk1p2"/* USDHC2 */

259

260 #define CONFIG_CMD_BMODE

261

......

275

276/* NAND stuff */

277 #ifdef CONFIG_SYS_USE_NAND

278 #define CONFIG_CMD_NAND

279 #define CONFIG_CMD_NAND_TRIMFFS

280

281 #define CONFIG_NAND_MXS

282 #define CONFIG_SYS_MAX_NAND_DEVICE 1

283 #define CONFIG_SYS_NAND_BASE 0x40000000

284 #define CONFIG_SYS_NAND_5_ADDR_CYCLE

285 #define CONFIG_SYS_NAND_ONFI_DETECTION

286

287/* DMA stuff, needed for GPMI/MXS NAND support */

288 #define CONFIG_APBH_DMA

289 #define CONFIG_APBH_DMA_BURST

290 #define CONFIG_APBH_DMA_BURST8

291 #endif

292

293 #define CONFIG_ENV_SIZE SZ_8K

294 #if defined( CONFIG_ENV_IS_IN_MMC)

295 #define CONFIG_ENV_OFFSET ( 12* SZ_64K)

296 #elif defined( CONFIG_ENV_IS_IN_SPI_FLASH)

297 #define CONFIG_ENV_OFFSET ( 768* 1024)

298 #define CONFIG_ENV_SECT_SIZE ( 64* 1024)

299 #define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS

300 #define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS

301 #define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE

302 #define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED

303 #elif defined( CONFIG_ENV_IS_IN_NAND)

304 #undef CONFIG_ENV_SIZE

305 #define CONFIG_ENV_OFFSET ( 60<< 20)

306 #define CONFIG_ENV_SECT_SIZE ( 128<< 10)

307 #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE

308 #endif

309

310

311/* USB Configs */

312 #define CONFIG_CMD_USB

313 #ifdef CONFIG_CMD_USB

314 #define CONFIG_USB_EHCI

315 #define CONFIG_USB_EHCI_MX6

316 #define CONFIG_USB_STORAGE

317 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET

318 #define CONFIG_USB_HOST_ETHER

319 #define CONFIG_USB_ETHER_ASIX

320 #define CONFIG_MXC_USB_PORTSC ( PORT_PTS_UTMI | PORT_PTS_PTW)

321 #define CONFIG_MXC_USB_FLAGS 0

322 #define CONFIG_USB_MAX_CONTROLLER_COUNT 2

323 #endif

324

325 #ifdef CONFIG_CMD_NET

326 #define CONFIG_CMD_PING

327 #define CONFIG_CMD_DHCP

328 #define CONFIG_CMD_MII

329 #define CONFIG_FEC_MXC

330 #define CONFIG_MII

331 #define CONFIG_FEC_ENET_DEV 1

332

333 #if( CONFIG_FEC_ENET_DEV == 0)

334 #define IMX_FEC_BASE ENET_BASE_ADDR

335 #define CONFIG_FEC_MXC_PHYADDR 0x2

336 #define CONFIG_FEC_XCV_TYPE RMII

337 #elif ( CONFIG_FEC_ENET_DEV == 1)

338 #define IMX_FEC_BASE ENET2_BASE_ADDR

339 #define CONFIG_FEC_MXC_PHYADDR 0x1

340 #define CONFIG_FEC_XCV_TYPE RMII

341 #endif

342 #define CONFIG_ETHPRIME "FEC"

343

344 #define CONFIG_PHYLIB

345 #define CONFIG_PHY_MICREL

346 #endif

347

348 #define CONFIG_IMX_THERMAL

349

350 #ifndef CONFIG_SPL_BUILD

351 #define CONFIG_VIDEO

352 #ifdef CONFIG_VIDEO

353 #define CONFIG_CFB_CONSOLE

354 #define CONFIG_VIDEO_MXS

355 #define CONFIG_VIDEO_LOGO

356 #define CONFIG_VIDEO_SW_CURSOR

357 #define CONFIG_VGA_AS_SINGLE_DEVICE

358 #define CONFIG_SYS_CONSOLE_IS_IN_ENV

359 #define CONFIG_SPLASH_SCREEN

360 #define CONFIG_SPLASH_SCREEN_ALIGN

361 #define CONFIG_CMD_BMP

362 #define CONFIG_BMP_16BPP

363 #define CONFIG_VIDEO_BMP_RLE8

364 #define CONFIG_VIDEO_BMP_LOGO

365 #define CONFIG_IMX_VIDEO_SKIP

366 #endif

367 #endif

368

369 #define CONFIG_IOMUX_LPSR

370

......

375 #endif

从示例代码33.2.2.1可以看出,mx6ull_alientek_emmc.h文件中基本都是"CONFIG_"开头的宏定义,这也说明mx6ull_alientek_emmc.h文件的主要功能就是配置或者裁剪uboot。如果需要某个功能的话就在里面添加这个功能对应的CONFIG_XXX宏即可,如果不需要某个功能的话就删除掉对应的宏即可。我们以示例代码33.2.2.1为例,详细的看一下mx6ull_alientek_emmc.h中这些宏都是什么功能。

第14行,添加了头文件mx6_common.h,如果在mx6ull_alientek_emmc.h中没有发现有配置某个功能或命令,但是实际却存在的话,可以到mx6_common.h文件里面去找一下。

第29~39行,设置DRAM的大小,宏PHYS_SDRAM_SIZE就是板子上DRAM的大小,如果用的NXP官方的9X9 EVK开发板的话DRAM大小就为256MB。否则的话默认为512MB,正点原子的I.MX6U-ALPHA开发板用的是512MB DDR3。

第50行,定义宏CONFIG_DISPLAY_CPUINFO,uboot启动的时候可以输出CPU信息。

第51行,定义宏CONFIG_DISPLAY_BOARDINFO,uboot启动的时候可以输出板子信息。

第54行,CONFIG_SYS_MALLOC_LEN为malloc内存池大小,这里设置为16MB。

第56行,定义宏CONFIG_BOARD_EARLY_INIT_F,这样board_init_f函数就会调用board_early_init_f函数。

第57行,定义宏CONFIG_BOARD_LATE_INIT,这样board_init_r函数就会调用board_late_init函数。

第59、60行,使能I.MX6ULL的串口功能,宏CONFIG_MXC_UART_BASE表示串口寄存器基地址,这里使用的串口1,基地址为UART1_BASE,UART1_BASE定义在文件arch/arm/include/asm/arch-mx6/imx-regs.h中,imx-regs.h是I.MX6ULL寄存器描述文件,根据imx-regs.h可得到UART1_BASE的值如下:

UART1_BASE= (ATZ1_BASE_ADDR + 0x20000)

=AIPS1_ARB_BASE_ADDR + 0x20000

=0x02000000 + 0x20000

=0X02020000

查阅I.MX6ULL参考手册,UART1的寄存器基地址正是0X02020000,如图33.2.2.1所示:

图33.2.2.1 UART1寄存器地址表

第63、64行, EMMC接在I.MX6ULL的USDHC2上,宏CONFIG_SYS_FSL_ESDHC_ADDR为EMMC所使用接口的寄存器基地址,也就是USDHC2的基地址。

第67~72行,跟NAND相关的宏,因为NAND和USDHC2的引脚冲突,因此如果使用NAND的只能使用一个USDHC设备(SD卡)。如果没有使用NAND,那么就有两个USDHC设备(EMMC和SD卡),宏CONFIG_SYS_FSL_USDHC_NUM表示USDHC数量。EMMC版本的核心版没有用到NAND,所以CONFIG_SYS_FSL_USDHC_NUM=2。

第75~81,和I2C有关的宏定义,用于控制使能哪个I2C,I2C的速度为多少。

第92~96行,NAND的分区设置,如果使用NAND的话,默认的NAND分区为:"mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) ",分区结果如表33.2.2.1所示:

表33.2.2.1 NAND分区设置

NAND的分区是可以调整的,比如boot分区我们用不了64M这么大,因此可以将其改小,其他的分区一样的。

第98~111行,宏CONFIG_MFG_ENV_SETTINGS定义了一些环境变量,使用MfgTool烧写系统时候会用到这里面的环境变量。

第113~202行,通过条件编译来设置宏CONFIG_EXTRA_ENV_SETTINGS,宏CONFIG_EXTRA_ENV_SETTINGS也是设置一些环境变量,此宏会设置bootargs这个环境变量,后面我们会详细分析这个宏定义。

第204~217行,设置宏CONFIG_BOOTCOMMAND,此宏就是设置环境变量bootcmd的值。后面会详细的分析这个宏定义。

第220~222行,设置命令memtest相关宏定义,比如使能命令memtest,设置memtest测试的内存起始地址和内存大小。

第224行,宏CONFIG_SYS_LOAD_ADDR表示linux kernel在DRAM中的加载地址,也就是linuxkernel在DRAM中的存储首地址,CONFIG_LOADADDR=0X80800000。

第225行,宏CONFIG_SYS_HZ为系统时钟频率,这里为1000Hz。

第227行,宏CONFIG_STACKSIZE为栈大小,这里为128KB。

第230行,宏CONFIG_NR_DRAM_BANKS为DRAM BANK的数量,I.MX6ULL只有一个DRAM BANK,我们也只用到了一个BANK,所以为1。

第231行,宏PHYS_SDRAM为I.MX6ULL的DRAM控制器MMDC0所管辖的DRAM范围其实地址,也就是0X80000000。

第233行,宏CONFIG_SYS_SDRAM_BASE为DRAM的其实地址。

第234行,宏CONFIG_SYS_INIT_RAM_ADDR为I.MX6ULL内部IRAM的起始地址(也就是OCRAM的起始地址),为0X00900000。

第235行,宏CONFIG_SYS_INIT_RAM_SIZE为I.MX6ULL内部IRAM的大小(OCRAM的大小),为0X00040000=128KB。

第237~240行,宏CONFIG_SYS_INIT_SP_OFFSET和CONFIG_SYS_INIT_SP_ADDR与初始SP有关,第一个为初始SP偏移,第二个为初始SP地址。

第256行,宏CONFIG_SYS_MMC_ENV_DEV为默认的MMC设备,这里默认为USDHC2,也就是EMMC。

第257行,宏CONFIG_SYS_MMC_ENV_PART为模式分区,默认为第0个分区。

第258行,宏CONFIG_MMCROOT设置进入linux系统的根文件系统所在的分区,这里设置为"/dev/mmcblk1p2",也就是EMMC设备的第2个分区。第0个分区保存uboot,第1个分区保存linux镜像和设备树,第2个分区为Linux系统的根文件系统。

第277~291行,与NAND有关的宏定义,如果使用NAND的话。

第293行,宏CONFIG_ENV_SIZE为环境变量大小,默认为8KB。

第294~308行,宏CONFIG_ENV_OFFSET为环境变量偏移地址,这里的偏移地址是相对于存储器的首地址。如果环境变量保存在EMMC中的话,环境变量偏移地址为12*64KB。如果环境变量保存在SPI FLASH中的话,偏移地址为768*1024。如果环境变量保存在NAND中的话,偏移地址为60<<20(60MB),并且重新设置环境变量的大小为128KB。

第312~323行,与USB相关的宏定义。

第325~342行,与网络相关的宏定义,比如使能dhcp、ping等命令。第331行的宏CONFIG_FEC_ENET_DEV指定uboot所使用的网口,I.MX6ULL有两个网口,为0的时候使用ENET1,为1的时候使用ENET2。宏IMX_FEC_BASE为ENET接口的寄存器首地址,宏CONFIG_FEC_MXC_PHYADDR为网口PHY芯片的地址。宏CONFIG_FEC_XCV_TYPE为PHY芯片所使用的接口类型,I.MX6U-ALPHA开发板的两个PHY都使用的RMII接口。

第344~END,剩下的都是一些配置宏,比如CONFIG_VIDEO宏用于开启LCD,CONFIG_VIDEO_LOGO使能LOGO显示,CONFIG_CMD_BMP使能BMP图片显示指令。这样就可以在uboot中显示图片了,一般用于显示logo。

关于mx6ull_alientek_emmc.h就讲解到这里,其中以CONFIG_CMD开头的宏都是用于使能相应命令的,其他的以CONFIG开头的宏都是完成一些配置功能的。以后会频繁的和mx6ull_alientek_emmc.h这个文件打交道。

33.2.3 添加开发板对应的板级文件夹

uboot中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。NXP的I.MX系列芯片的所有板级文件夹都存放在board/freescale目录下,在这个目录下有个名为mx6ullevk的文件夹,这个文件夹就是NXP官方I.MX6ULL EVK开发板的板级文件夹。复制mx6ullevk,将其重命名为mx6ull_alientek_emmc,命令如下:

cd board/freescale/

cp mx6ullevk/ -r mx6ull_alientek_emmc

进入mx6ull_alientek_emmc目录中,将其中的mx6ullevk.c文件重命名为mx6ull_alientek_emmc.c,命令如下:

cdmx6ull_alientek_emmc

mv mx6ullevk.c mx6ull_alientek_emmc.c

我们还需要对mx6ull_alientek_emmc目录下的文件做一些修改:

1、修改mx6ull_alientek_emmc目录下的Makefile文件

将mx6ull_alientek_emmc下的Makefile文件内容改为如下所示:

示例代码33.2.3.1 Makefile文件

1 # ( C) Copyright 2015 Freescale Semiconductor, Inc.

2 #

3 # SPDX- License- Identifier: GPL- 2.0+

4 #

5

6 obj- y := mx6ull_alientek_emmc. o

7

8 extra- $( CONFIG_USE_PLUGIN):= plugin. bin

9 $( obj)/ plugin. bin: $( obj)/ plugin. o

10 $( OBJCOPY)- O binary -- gap- fill 0xff $< $@

重点是第6行的obj-y,改为mx6ull_alientek_emmc.o,这样才会编译mx6ull_alientek_emmc.c这个文件。

2、修改mx6ull_alientek_emmc目录下的imximage.cfg文件

将imximage.cfg中的下面一句:

PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000

改为:

PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000

3、修改mx6ull_alientek_emmc目录下的Kconfig文件

修改Kconfig文件,修改后的内容如下:

示例代码33.2.3.2 Kconfig文件

1if TARGET_MX6ULL_ALIENTEK_EMMC

2

3 config SYS_BOARD

4default "mx6ull_alientek_emmc"

5

6 config SYS_VENDOR

7default "freescale"

8

9 config SYS_SOC

10default "mx6"

11

12 config SYS_CONFIG_NAME

13default "mx6ull_alientek_emmc"

14

15 endif

4、修改mx6ull_alientek_emmc目录下的MAINTAINERS文件

修改MAINTAINERS文件,修改后的内容如下:

1 MX6ULL_ALIENTEK_EMMC BOARD

2 M: Peng Fan < peng. fan@nxp. com>

3 S: Maintained

4 F: board/ freescale/ mx6ull_alientek_emmc/

5 F: include/ configs/ mx6ull_alientek_emmc. h

33.2.4 修改U-Boot图形界面配置文件

uboot是支持图形界面配置,关于uboot的图形界面配置下一章会详细的讲解。修改文件arch/arm/cpu/armv7/mx6/Kconfig(如果用的I.MX6UL的话,应该修改arch/arm/Kconfig这个文件),在207行加入如下内容:

示例代码33.2.4.1 Kconfig文件

1 config TARGET_MX6ULL_ALIENTEK_EMMC

2 bool"Support mx6ull_alientek_emmc"

3 select MX6ULL

4 select DM

5 select DM_THERMAL

在最后一行的endif的前一行添加如下内容:

示例代码33.2.4.2 Kconfig文件

1 source "board/freescale/mx6ull_alientek_emmc/Kconfig"

添加完成以后的Kconfig文件如图33.2.4.1所示:

图33.2.4.1 修改后的Kconfig文件

到此为止,I.MX6U-ALPHA开发板就已经添加到uboot中了,接下来就是编译这个新添加的开发板。

33.2.5 使用新添加的板子配置编译uboot

在uboot根目录下新建一个名为mx6ull_alientek_emmc.sh的shell脚本,在这个shell脚本里面输入如下内容:

示例代码33.2.5.1 mx6ull_alientek_emmc.sh脚本文件

1 #!/bin/bash

2 make ARCH= arm CROSS_COMPILE= arm- linux- gnueabihf- distclean

3 make ARCH= arm CROSS_COMPILE= arm- linux- gnueabihf- mx6ull_alientek__emmc_defconfig

4 make V= 1 ARCH= arm CROSS_COMPILE= arm- linux- gnueabihf-- j16

第3行我们使用的默认配置文件就是33.2.1节中新建的mx6ull_alientek_emmc_defconfig这个配置文件。给予mx6ll_alientek_emmc.sh可执行权限,然后运行脚本来完成编译,命令如下:

chmod 777 mx6ull_alientek_emmc.sh //给予可执行权限,一次即可

./mx6ull_alientek_emmc.sh //运行脚本编译uboot

等待编译完成,编译完成以后输入如下命令,查看一下33.2.2小节中添加的mx6ull_alientek_emmc.h这个头文件有没有被引用。

grep -nR "mx6ull_alientek_emmc.h"

如果有很多文件都引用了mx6ull_alientek_emmc.h这个头文件,那就说明新板子添加成功,如图33.2.5.1所示:

图33.2.5.1 查找结果

编译完成以后就使用imxdownload将新编译出来的u-boot.bin烧写到SD卡中测试,SecureCRT输出结果如图33.2.5.2所示:

图33.2.5.1 uboot启动过程

从图33.2.5.1可以看出,此时的Board还是"MX6ULL 14x14 EVK",因为我们参考的NXP官方的I.MX6ULL开发板来添加自己的开发板。如果接了LCD屏幕的话会发现LCD屏幕并没有显示NXP的logo,而且从图33.2.5.1可以看出此时的网络同样也没识别出来。前面已经说了,默认uboot中的LCD驱动和网络驱动在正点原子的I.MX6U-ALPHA开发板上是有问题的,需要修改。

33.2.6 LCD驱动修改

一般uboot中修改驱动基本都是在xxx.h和xxx.c这两个文件中进行的,xxx为板子名称,比如mx6ull_alientek_emmc.h和mx6ull_alientek_emmc.c这两个文件。

一般修改LCD驱动重点注意以下几点:

①、LCD所使用的GPIO,查看uboot中LCD的IO配置是否正确。

②、LCD背光引脚GPIO的配置。

③、LCD配置参数是否正确。

正点原子的I.MX6U-ALPHA开发板LCD原理图和NXP官方I.MX6ULL开发板一致,也就是LCD的IO和背光IO都一样的,所以IO部分就不用修改了。需要修改的之后LCD参数,打开文件mx6ull_alientek_emmc.c,找到如下所示内容:

示例代码33.2.6.1 LCD驱动参数

1struct display_info_t const displays[]={{

2 . bus = MX6UL_LCDIF1_BASE_ADDR,

3 . addr = 0,

4 . pixfmt = 24,

5 . detect =NULL,

6 . enable = do_enable_parallel_lcd,

7 . mode ={

8 . name = "TFT43AB",

9 . xres = 480,

10 . yres = 272,

11 . pixclock = 108695,

12 . left_margin = 8,

13 . right_margin = 4,

14 . upper_margin = 2,

15 . lower_margin = 4,

16 . hsync_len = 41,

17 . vsync_len = 10,

18 . sync = 0,

19 . vmode = FB_VMODE_NONINTERLACED

20 }}};

示例代码33.2.6.1中定义了一个变量displays,类型为display_info_t,这个结构体是LCD信息结构体,其中包括了LCD的分辨率,像素格式,LCD的各个参数等。display_info_t定义在文件arch/arm/include/asm/imx-common/video.h中,定义如下:

示例代码33.2.6.2 display_info结构体

1struct display_info_t {

2 int bus;

3 int addr;

4 int pixfmt;

5 int(* detect)( struct display_info_t const* dev);

6 void(* enable)( struct display_info_t const* dev);

7 struct fb_videomode mode;

8};

pixfmt是像素格式,也就是一个像素点是多少位,如果是RGB565的话就是16位,如果是888的话就是24位,一般使用RGB888。结构体display_info_t还有个mode成员变量,此成员变量也是个结构体,为fb_videomode,定义在文件include/linux/fb.h中,定义如下:

示例代码33.2.6.3 fb_videomode结构体

1struct fb_videomode {

2 constchar* name; /* optional */

3 u32 refresh; /* optional */

4 u32 xres;

5 u32 yres;

6 u32 pixclock;

7 u32 left_margin;

8 u32 right_margin;

9 u32 upper_margin;

10 u32 lower_margin;

11 u32 hsync_len;

12 u32 vsync_len;

13 u32 sync;

14 u32 vmode;

15 u32 flag;

16};

结构体fb_videomode里面的成员变量为LCD的参数,这些成员变量函数如下:

name: LCD名字,要和环境变量中的panel相等。

xres、yres: LCD X轴和Y轴像素数量。

pixclock :像素时钟,每个像素时钟周期的长度,单位为皮秒。

left_margin: HBP,水平同步后肩。

right_margin: HFP,水平同步前肩。

upper_margin :VBP,垂直同步后肩。

lower_margin :VFP,垂直同步前肩。

hsync_len: HSPW,行同步脉宽。

vsync_len :VSPW,垂直同步脉宽。

vmode: 大多数使用FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。

可以看出,这些参数和我们第二十四章讲解RGB LCD的时候参数基本一样,唯一不同的像素时钟pixclock的含义不同,以正点原子的7寸1024*600分辨率的屏幕(ATK7016)为例,屏幕要求的像素时钟为51.2MHz,因此:

pixclock=(1/51200000)*10^12=19531

在根据其他的屏幕参数,可以得出ATK7016屏幕的配置参数如下:

示例代码33.2.6.4 ATK7016屏幕配置参数

1struct display_info_t const displays[]={{

2 . bus = MX6UL_LCDIF1_BASE_ADDR,

3 . addr = 0,

4 . pixfmt = 24,

5 . detect =NULL,

6 . enable = do_enable_parallel_lcd,

7 . mode ={

8 . name = "TFT7016",

9 . xres = 1024,

10 . yres = 600,

11 . pixclock = 19531,

12 . left_margin = 140, //HBPD

13 . right_margin = 160, //HFPD

14 . upper_margin = 20, //VBPD

15 . lower_margin = 12, //VFBD

16 . hsync_len = 20, //HSPW

17 . vsync_len = 3, //VSPW

18 . sync = 0,

19 . vmode = FB_VMODE_NONINTERLACED

20}}};

使用示例代码33.2.6.4中的屏幕参数替换掉mx6ull_alientek_emmc.c中uboot默认的屏幕参数。

打开mx6ull_alientek_emmc.h,找到所有如下语句:

panel=TFT43AB

将其改为:

panel=TFT7016

也就是设置panel为TFT7016,panel的值要与示例代码33.2.6.4中的.name成员变量的值一致。修改完成以后重新编译一遍uboot并烧写到SD中启动。

重启以后LCD驱动一般就会工作正常了,LCD上回显示NXP的logo。但是有可能会遇到LCD并没有工作,还是黑屏,这是什么原因呢?在uboot命令模式输入"printf"来查看环境变量panel的值,会发现panel的值要是TFT43AB(或其他的,反正不是TFT7016),如图33.2.6.1所示:

图33.2.6.1 panel的值

这是因为之前有将环境变量保存到EMMC中,uboot启动以后会先从EMMC中读取环境变量,如果EMMC中没有环境变量的话才会使用mx6ull_alientek_emmc.h中的默认环境变量。如果EMMC中的环境变量panel不等于TFT7016,那么LCD显示肯定不正常,我们只需要在uboot中修改panel的值为TFT7016即可,在uboot的命令模式下输入如下命令:

setenv panel TFT7016

saveenv

上述命令修改环境变量panel为TFT7016,然后保存,重启uboot,此时LCD驱动就工作正常了。如果LCD还是没有正常工作的,那就要检查自己哪里有没有改错,或者还有哪里没有修改。

杀死NAND Flash,替代DRAM;3D Xpoint有这个能力吗?

来源:半导体行业观察翻译自computerworld,作者Lucas Mearian ,谢谢。

在3D NAND Flash大行其道的21世纪,当Intel和美光在2015年首次介绍3D Xpoint的时候,市场掀起了轩然大波。据当时的介绍,3D Xpoint的会比NAND Flash快1000倍,且寿命也会比其长1000倍。

但实际上,这样的性能表现只能出现在PPT里。根据实际的测试,3D Xpoint只是比NAND快10倍,且在读入新数据的时候,需要先擦除老数据。

但是这个新兴的固态存储器将会在数据中心找到他的位置,因为他的价格只有DRAM的一半,只主要是因为它会和传统的存储技术搭配来提升性能。但是相比于NAND Flash,3D Xpoint的价格还是会贵很多。

随着传输数据、云计算、数据分析等多样需求的增长,更高性能的存储也成为厂商的目标。这就给3D Xpoint带来了新的机会。

下面,我们来看一下3D Xpoint。

“毫无疑问,这项技术会给数据中心带来重要的影响,但是在PC端的影响则没有那么大”,Gartner的半导体和NAND Flash VP Joseph Unsworth表示。“无论是超大规模数据中心、云服务供应商,或者是传统的企业存储客户,他们对这项技术都会感兴趣”,他补充说。

但是3D Xpoint供应商并不能说服客户用其去替代所有的DRAM,即使使用这项新技术能够帮忙降低成本。主要因为在NAND Flash的SSD中,其性能遭到了质疑。

什么是3D Xpoint?

相信大家看过很多这个新技术的介绍。简单来说,这就是一个新型的非易失性固态存储,拥有比NAND Flash更强悍的性能,以及更长久的寿命。而从价格来说,他是处于DRAM和NAND Flash之间的。

根据Gartner的数据显示,现在DRAM的售价基本是每gigabyte 5美金,而NAND的价格则是25美分每gigabyte。3D Xpoint的大批量采购价格则会在每gigabyte 2.4美金这个区间。按目前看来,到2021年,3D Xpoint的售价也会比NAND Flash贵许多。

但是其实无论是Intel或者美光,都没有谈过太多关于这项新技术的细节,他们只说这是一项基于电子存储的技术,和Flash存储和DRAM一样,也没有用到晶体管。他们也声称这并不是ReRAM或者忆阻器。这两者被认为是NAND未来的最大挑战者。

根据专家用排除法分析,可以得到3D Xpoint应该是相变存储(PCM)技术,和美光先前开发过的一种技术差不多,而性能也相近。

PCM 作为新一代存储技术,利用特殊材料在晶态和非晶态之间相互转换的相变来储存数据,其芯片目前广泛使用的核心材料是GST(由锗锑碲按比例混合而成)。这和美光Russ Meyer之前说的不谋而合——“存储单元本身是在两个不同状态之间简单变动的”。

在PCM中,非晶态的高阻率是保存为0,低阻率的静态则保存为1.

3D Xpoint的架构和显微镜下的窗格子类似。而那些支持则是由硫族化合物组成,且搭配了开关,能够允许数据的读写。

Intel非易失性存储事业部GM Rob Crook表示,3D Xpoint并不像DRAM那样,把数据存储在电容的电子里,也不像NAND那样把数据存储在浮动栅的电子阱里。它使用一种物理材料,这种材料本身能够改变0或1状态,然后存储数据。但是他们需要将其尺寸变小,以适合更多应用。

为什么3D Xpoint能够吸引如此多的关注?当然是因为他在PCIe/NVMe接口连接的时候,拥有比NAND Flash高十倍的性能,且使用时间会长1000倍。这也就意味着持续读写次循环超过100万次,也就意味着,这个存储一旦装上,在不坏的情况下能永久使用。与之对比,现在的NAND Flash只有3000到10000的持续读写循环。如果带有损耗平衡和误差纠正软件,这个循环能提升,但和100万比,这还是小巫见大巫。

3D Xpoint还有比较低的延迟。与NAND Flash相比,这个数据是1000倍,与DRAM相比,则是十倍。明显看出,在高速读取的应用中,这回事更明智的选择。S

这种优势让3D Xpoint能够降低数据中心存储体系的落差(包括处理器上的SRAM,DRAM,NAND FLAHS,HHD、磁带或光盘)。这个还能够弥补易失性的DRAM和非易失性NAND Flash SSD 之间的差距。

也许这是数据中心的未来。Intel NVM方案部门主管James Myers表示,他们的3D Xpoint产品Optane能够用来执行有限的数据集或者实时存储和升级数据。

相反地,传统的NAND Flash 只能批次地处理存储数据,利用列式数据库系统分析。这就需要非常多的读写操作。

“不会有很多人为更高的连续吞吐量支付额外的钱,因为很多的分析可以在凌晨2点到5点完成,因为哪个时段不会有很多的业务操作”,Myers表示。

Intel的首个3D Xpoint SSD P4800x每秒能够执行550000次的读写操作(IOPS),与之对比,Intel最顶尖的NAND Flash SSD的IOPS只能达到400000。

和DRAM一样,3D Xpoint可以按字节寻址,这就意味着每一个存储单元有一个不同的位置,这不像分区的NAND,在应用在为数据搜索的时候,不允许“超车”。

“这个不是Flash,也不是DRAM, 3D Xpoint是一个介乎这两者之间的技术,而生态系统的支持对于这项技术的拓展极为重要。”Unsworth说。目前我们还没看到任何一个飞翼式的DIMM被装配,因此这会是一个很大的挖掘空间。

3D Xpoint什么时候可以准备好?

Intel已经开拓出了一个不同于美光的3D Xpoint路线。按照他们的说法,其Optane品牌适合于数据中心和桌面PC。美光则表示其Quantx SSD非常适合于数据中心,他们也或多或少提到,其产品也会适合消费级别的SSD。

在2015年,Intel小批量生产了使用IM Flash技术的3D Xpoint Wafer。到了去年,Intel和Micron则投资了做立在犹他州Lehi的Fab,大批量生产3D Xpoint产品。

上个月,Intel开始出货他的手系列新品:专为PC打造的 Intel Optane 存储加速模块(16GB/MSRP $44和 32GB/$77),另外还有数据中心级别的375GB Intel Optane SSD DC P4800X扩展卡,售价1520美金。DC P4800X使用的是PCIe NVMe 3.0×4(四路)接口。

Optane 存储PC加速器模组能够被应用到在一个七代Intel Kaby Lake平台上,加速各种SATA连接的存储设备。在存储中加上Optane模组就像在桌面PC或者笔记本上加了某种类型的缓存。

DC P4800X是首个为数据中心生产的3D Xpoint SSD,Intel方面表示,后续会推出更多此类应用,包括一个企业泣别的Optane SSD,他的容量为750GB。Intel方面表示,这会在今年第二季度到来。而1.5TB的SSD则会在今年下半年推出。

这些SSD同样以模组的形式存在,并适用于PCIe/NVMe和U.2插槽,这就意味着他们适用于使用AMD 32核Naples 处理器平台的工作站和服务器。

Intel还计划明年推出他们DRAM类型的DIMM模组Optane。而美光方面则打算在20147年下半年推出其QuantX产品。

3D Xpoint会对电脑性能造成什么影响?

Intel表示,其Optane将PC的启动时间减少了一半,并将整体系统性能增加了28%,加载游戏速度也快了65%。

DC P4800在随机读写环境下的表现也非常出色,因此我们可以用它来增强服务器的DRAM。在随机读写的状态下,Optane会自动启动,这在高端PC和服务器中非常常见。Optane的随机写速度比传统的SSD快10倍,而读速度也有三倍左右的提升。

除此之外,新的DC P4800 SSD 的读写延迟低于10微秒,这在NAND Flash的SSD中是不可能任务,后者的延迟在30到100ms这个范围。而DC 3700的平均延迟则有20ms,这是DC P4800的两倍。P4800X的读写延迟接近相同,这不同于Flash存储的SSD。

3D Xpoint会“杀死”NAND Flash吗?

或者这样的结局不会产生,Intel和美光双方都认为3D Xpoint与NAND是互补的。他的出现主要是弥补NAND和DRAM的差距。然而,随着新3D Xpoint的普及,SSD的经济规模会增长,分析师们认为它会挑战现存的存储技术,不是指NAND,而是DRAM。

Gartner预测,到2018年,3D Xpoint 会在数据中心中占领上风。届时它会吸引很多关键客户的目光。这不仅仅限于服务器、存储,超算中心或者云计算,软件客户也是他们的潜在关注者,Unsworth说。一旦你能够在数据库分析速度和成本上找到一个平衡,那么就会吸引更多的客户执行实时的数据分析处理。

因此我认为这是一个革命性的技术,他补充说。但这个最终被广泛采纳需要一段时间,数据中心生态链需要一点时间去接纳这个新存储技术,芯片组和第三方应用的支持也需要时间去兼容。

另外,现在只有Intel和美光两家供应商提供3D Xpoint,从长期看来,这个技术应该也会授权给其他厂商。

再者,包括ReRAM和忆阻器在内的竞争技术也会在未来某一天到来,但他们当中没有哪一个可以满足高存储和大批量出货的需求。

去年秋天,三星介绍了其新的Z-NAND存储,这是3D Xpoint的一个明显竞争者。这个即将发布的Z-NAND SSD延迟会较3D NAND Flahs降低四分之三,而顺序读速度也会快1.6倍,三星计划在今年推出其Z-NAND。

那么,这意味着NAND的“死亡”么?我认为近期内都不可能。

随着挑战3D Xpoint的非易失性存储技术逐渐出现,传统的NAND Flahs依然有很长的路要走,直到2025年,这个技术都是安然无忧的。

而最新版本的3D或者垂直NAND堆栈已经到了64层,这比传统的平面NAND的密度有了很大提升。制造们打算在明年将其扩展到96层,并打算在未来几年将其扩展到128层。

初次之外,现在的的3bit/ cell TLC NAND有望转向4bit/cell 的 QLC 技术,这样能够增加密度,同时降低生产成本。

这是一个很有弹性的产业,因为在世界范围内有很多很大的供应商。同时,中国也会在当中充当非常重要的角色。Unsworth认为,如果NAND在几年内会死亡,他们就不会花费数百亿美元进入这个NAND Flaash产业。我看到了3D NAND慢下来了,但他们依然没碰到天花板,他补充说。

今天是《半导体行业观察》为您分享的第1274期内容,欢迎关注。

R

eading

相关问答

苹果4s刷机卡在正在 nand分区 了,怎么办?

苹果4s刷机卡在正在nand分区,其原因是在刷机过程中造成了参数错误。1、首先将iPhone手机关机。2、同时按住HOME键和关机键。3、持续上一步骤10秒钟左右...

如何让U-boot实现 Nand /Nor双启动?

这时候,Uboot通过另外的代码,实际是Nandsubsystem部分,把kernel从Nand读到内存上,再通过指令,然后CPU跳到Kernel入口地址执行。一旦Kernel跑起来,Kerne...

本地文件系统的组成要素?

文件是存储数据的基本单元,包括文本文件、图像文件、音频文件等。目录是用来组织文件的容器,可以包含文件和其他目录。文件系统结构包括磁盘分区、文件系统类...

文件格式和文件系统分别指什么?它们有什么区别?

类信息,都可以一种或多种文件格式保存在电脑存储中。每一种文件格式通常会有一种或多种扩展名可以用来识别,但也可能没有扩展名。扩展名可以帮助应用程序...

三星固态硬盘为什么有120G和128G?

选购SSD时是,大家很容易就发现怎么有些品牌标着128G,有些品牌标着120G呢?那8G的容量差跑哪去了?为什么系统显示的硬盘容量仅为119G?其实这与SSD中OP(Over-provisi...

手机自身存储空间如何 分区 ?-ZOL问答

APP2SD的工作原理:以4G的TF卡做比方,将4G的卡分成3个分区,FAT32作为你正常存储音乐,图片的普通存储范围,SWAP分区是作为系统缓存,越大对系统运行缓慢的影响愈好...

机械硬盘 分区 需要设置对齐 分区 到此扇区数的整倍数吗?

机械硬盘不需要,因为他是纯物理写入而固态硬盘需要,是用nand模拟硬盘数据会有扇区区块的。1.硬盘有机械硬盘和固态硬盘之分,机械硬盘即是传统普通硬盘,主要...

OP 分区 预留对SSD性能到底是否有影响-ZOL问答

而NAND颗粒容量单位为1024进制,两者正好相差约7.37%。这部分空间被默认用于作...第三层OP是用户在日常使用中可以分配的,一般用户也可以自己在初次分区的时候...

ufs3.0和12G内存哪个对流畅运行影响大?

感谢您的阅读!我们先了解下什么是UFS3.0?什么是UFS2.1?我们知道UFS是UniveralFlashStorage的简称,它是由多个闪存芯片、主控、缓存组成的阵列式存储模块,...从.....

视易机顶盒格式化命令是什么?

在机顶盒网络管理器中,对该机顶盒设置添加"force_format_nandflash=1"这个字段重新格式化,格式化后,成功进入系统,即可格式化机顶盒硬盘;格式化(format...

 宏楠个人资料  三星堆百度百科 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部