很久没有更新CSDN了。这几年工作重心已经慢慢转移到linux和国产操作系统了。但是最近一周有一个网友看了我以前写的博客,找到了我,让我帮忙解决下zynq7020 移植BSP问题,他用的是正点原子开发板,想把vxWorks跑起来。于是我手把手告诉他怎么移植,顺便记录以下过程。
使用最原始BSP 移植调试
使用的BSP 为:
Vxworks应该是起来了,打印乱码,怀疑是串口编码格式问题,尝试修改
改成UTF-8 看看
还是乱码
修改串口时钟
测试结果:Vxworks直接起来了
解决没有命令行问题
解决办法:勾选shell 组件
选中后关闭配置组件
重新编译vxworks,再测试
正确进入命令行,回车有反应。
总结: windRiver 原有的BSP 对ZYNQ 支持已经非常友好,看过其他博主的博客。他是启动的vxworks7. 提到要修改串口。因为WindRiver 自带开发板 使用的是串口1而不是串口0 作为console口。我上面测试用的板子也是用uart1 作为console口。如果使用正点原子的开发板作为console口,还需要有以下修改。
修改bsp 目录下hwconfig 文件
LOCAL struct intrCtlrInputs gicInputs[] = {
/* pin, driver, unit, index */
{ INT_VEC_UART1, "zynqSioDev", 0, 0 },
{ INT_VEC_TMR0, "armMpCoreTimer", 0, 0 },
#ifdef INCLUDE_AUX_CLK
{ INT_VEC_AWDT, "armMpCoreTimer", 1, 0 },
#endif /* INCLUDE_AUX_CLK */
#ifdef DRV_STORAGE_SDHC
{ INT_VEC_SDIO0, "sdhci", 0, 0 },
#endif /* DRV_STORAGE_SDHC */
#ifdef DRV_I2CBUS_ZYNQ7K
{ INT_VEC_I2C0, "zynq7kI2c", 0, 0 },
#endif /* DRV_I2CBUS_ZYNQ7K */
#ifdef INCLUDE_ZYNQ7K_QSPI
{ INT_VEC_QSPI, "qspi", 0, 0 },
#endif /* INCLUDE_ZYNQ7K_QSPI */
#ifdef INCLUDE_EHCI
{ INT_VEC_USB0, "vxbPlbUsbEhci", 0, 0 },
#endif /* INCLUDE_EHCI */
#ifdef DRV_VXBEND_ZYNQMAC
{ INT_VEC_ETH0, "gem", 0, 0 },
#endif /* DRV_VXBEND_ZYNQMAC */
#ifdef DRV_TIMER_ZYNQ7K
{ INT_VEC_TTC0_0, "zynqTimer", 0, 0 },
#endif /* DRV_TIMER_ZYNQ7K */
#ifdef DRV_DMA_PL330
{ INT_VEC_DMAC, "pl330dma", 0, 0 },
#endif /* DRV_DMA_PL330 */
};
修改为
LOCAL struct intrCtlrInputs gicInputs[] = {
/* pin, driver, unit, index */
{ INT_VEC_UART0, "zynqSioDev", 0, 0 },
{ INT_VEC_TMR0, "armMpCoreTimer", 0, 0 },
#ifdef INCLUDE_AUX_CLK
{ INT_VEC_AWDT, "armMpCoreTimer", 1, 0 },
#endif /* INCLUDE_AUX_CLK */
#ifdef DRV_STORAGE_SDHC
{ INT_VEC_SDIO0, "sdhci", 0, 0 },
#endif /* DRV_STORAGE_SDHC */
#ifdef DRV_I2CBUS_ZYNQ7K
{ INT_VEC_I2C0, "zynq7kI2c", 0, 0 },
#endif /* DRV_I2CBUS_ZYNQ7K */
#ifdef INCLUDE_ZYNQ7K_QSPI
{ INT_VEC_QSPI, "qspi", 0, 0 },
#endif /* INCLUDE_ZYNQ7K_QSPI */
#ifdef INCLUDE_EHCI
{ INT_VEC_USB0, "vxbPlbUsbEhci", 0, 0 },
#endif /* INCLUDE_EHCI */
#ifdef DRV_VXBEND_ZYNQMAC
{ INT_VEC_ETH0, "gem", 0, 0 },
#endif /* DRV_VXBEND_ZYNQMAC */
#ifdef DRV_TIMER_ZYNQ7K
{ INT_VEC_TTC0_0, "zynqTimer", 0, 0 },
#endif /* DRV_TIMER_ZYNQ7K */
#ifdef DRV_DMA_PL330
{ INT_VEC_DMAC, "pl330dma", 0, 0 },
#endif /* DRV_DMA_PL330 */
};
const struct hcfDevice hcfDeviceList[] = {
{ "armGicDev", 0, VXB_BUSID_PLB, 0, armGIC0Num, armGIC0Resources },
{ "zynqSioDev", 0, VXB_BUSID_PLB, 0, zynqSioDev1Num, zynqSioDev1Resources },
{ "armMpCoreTimer", 0, VXB_BUSID_PLB, 0, zynqCPTimerDev0Num, zynqCPTimerDev0Resources },
#ifdef INCLUDE_AUX_CLK
{ "armMpCoreTimer", 1, VXB_BUSID_PLB, 0, zynqCPTimerDev1Num, zynqCPTimerDev1Resources },
#endif /* INCLUDE_AUX_CLK */
#ifdef DRV_TIMER_ZYNQ7K
{ "zynqTimer", 0, VXB_BUSID_PLB, 0, zynqTimerDev0Num, zynqTimerDev0Resources },
#endif /* DRV_TIMER_ZYNQ7K */
#ifdef DRV_VXBEND_ZYNQMAC
{ "gem", 0, VXB_BUSID_PLB, 0, zynqGemDevNum, zynqGemDevResources },
#endif /* DRV_VXBEND_ZYNQMAC */
#ifdef DRV_DMA_PL330
{ "pl330dma", 0, VXB_BUSID_PLB, 0, pl330DmaNum, pl330DmaResources},
#endif /* DRV_DMA_PL330 */
#ifdef DRV_STORAGE_SDHC
{ "sdhci", 0, VXB_BUSID_PLB, 0, zynqSdhcNum, zynqSdhcResources },
#endif /* DRV_STORAGE_SDHC */
#ifdef DRV_I2CBUS_ZYNQ7K
{ "zynq7kI2c", 0, VXB_BUSID_PLB, 0, i2c0Num, i2c0Resources },
#endif /* DRV_I2CBUS_ZYNQ7K */
#ifdef INCLUDE_EHCI
{ "vxbPlbUsbEhci", 0, VXB_BUSID_PLB, 0, usbEhci0Num, usbEhci0Resources },
#endif /* INCLUDE_EHCI */
{ NULL, 0, 0, 0, 0, NULL }
};
修改为
const struct hcfDevice hcfDeviceList[] = {
{ "armGicDev", 0, VXB_BUSID_PLB, 0, armGIC0Num, armGIC0Resources },
{ "zynqSioDev", 0, VXB_BUSID_PLB, 0, zynqSioDev0Num, zynqSioDev0Resources },
{ "armMpCoreTimer", 0, VXB_BUSID_PLB, 0, zynqCPTimerDev0Num, zynqCPTimerDev0Resources },
#ifdef INCLUDE_AUX_CLK
{ "armMpCoreTimer", 1, VXB_BUSID_PLB, 0, zynqCPTimerDev1Num, zynqCPTimerDev1Resources },
#endif /* INCLUDE_AUX_CLK */
#ifdef DRV_TIMER_ZYNQ7K
{ "zynqTimer", 0, VXB_BUSID_PLB, 0, zynqTimerDev0Num, zynqTimerDev0Resources },
#endif /* DRV_TIMER_ZYNQ7K */
#ifdef DRV_VXBEND_ZYNQMAC
{ "gem", 0, VXB_BUSID_PLB, 0, zynqGemDevNum, zynqGemDevResources },
#endif /* DRV_VXBEND_ZYNQMAC */
#ifdef DRV_DMA_PL330
{ "pl330dma", 0, VXB_BUSID_PLB, 0, pl330DmaNum, pl330DmaResources},
#endif /* DRV_DMA_PL330 */
#ifdef DRV_STORAGE_SDHC
{ "sdhci", 0, VXB_BUSID_PLB, 0, zynqSdhcNum, zynqSdhcResources },
#endif /* DRV_STORAGE_SDHC */
#ifdef DRV_I2CBUS_ZYNQ7K
{ "zynq7kI2c", 0, VXB_BUSID_PLB, 0, i2c0Num, i2c0Resources },
#endif /* DRV_I2CBUS_ZYNQ7K */
#ifdef INCLUDE_EHCI
{ "vxbPlbUsbEhci", 0, VXB_BUSID_PLB, 0, usbEhci0Num, usbEhci0Resources },
#endif /* INCLUDE_EHCI */
{ NULL, 0, 0, 0, 0, NULL }
};
时间不多,文档可能不完善,有具体问题可以加我QQ 刨根问底:450628513,请注明来意。