TI中文支持网
TI专业的中文技术问题搜集分享网站

PCIe启动过程中C6678程序加载

各位好!

我参考mcsdk_2_00_07_19\tools\boot_loader\examples\pcie里的pciedemo.c 和 pcieboot_interrupt.c的代码,发现demo中Host  PC通过PCIE链路将DSP程序写入DSP L2空间中,在更新MAGIC_ADDRESS,使DSP运行,即Host PC负责发送boot table,并最后写入MAGIC_ADDRESS。

我在demo的基础上开发了驱动程序,实现了DSP与Host  PC的数据传输,但每次运行都需要Host PC发送DSP boot table,再写MAGIC_ADDRESS,且由于工程需要在DSP上运行的代码量很大,过程繁琐。

请问有没有方法将DSP程序直接在DSP上自启动,不需要通过Host  PC发送。我想是否能实现板卡能通过PCIe模式启动时,自动加载flash中的DSP程序??

当然只要有方法能满足 将DSP中的数据通过PCIE传输至Host  PC即可!

多谢大家!

dennis wu:

您可以参考如下方式:

1.在IBL中加入PCIe配置,然后重新编译IBL,烧写到I2C EEPROM中;

2.将应用程序烧写到NAND flash中;

3.使用I2C EEPROM(IBL)+NAND flash方式启动。

此时,DSP上电后,IBL启动过程中会去配置PCIe EP设备,然后自动加载NAND中的DSP程序。应该能够满足你的需求。

Andy Yin1:

你是不想通过PCIe将程序从Host传送到DSP么?按照你的要求你可以使用flash加载,这样程序只要一次烧写在flash即可。

yong xu1:

回复 Andy Yin1:

您好!

您的意思是 6678通过PCIe模式启动后再加载flash程序?是这样吗? 

是不是就是者 dennis wu 如下所说的这样!

1.在IBL中加入PCIe配置,然后重新编译IBL,烧写到I2C EEPROM中;

2.将应用程序烧写到NAND flash中;

3.使用I2C EEPROM(IBL)+NAND flash方式启动。

我尝试过直接用NOR flash启动方式,但不理解的是如何将PCIe启动方式和flash两种启动方式结合起来??

我现在用的是1.0的评估板做的实验,采用的是I2C EEPROM启动,但最后板卡生产用的是2.0的芯片,是不是可以不设计I2C EEPROM用于修正PCIe的时钟了?

那么DSP程序应该存放在哪里,板卡用何种启动方式启动?

致谢!

yong xu1:

回复 dennis wu:

您好!

在PCIe boot时,由ROM code完成PCIe的配置。

现在按照您所说的变为I2C EEPROM(IBL)+NAND flash方式启动,那么在IBL中加入PCIe配置,即把原来ROM code放进IBL中,我想知道是否配置代码可以参考?

yong xu1:

回复 Andy Yin1:

各位,您好!

我在评估板上测试了i2c_boot_nor_example.c和i2c_boot_nand_example.c,都可以正确通过IIC二次启动正常运行。

如果我将我的应用程序烧到nor,拨码开发设置为

sw3 sw4 sw5 sw6

(off, off, on, off)1,2
(on, on, on, on)3
(on, on, on, off)4
(on, on, on, on)

那么通过AMC PCIe转接板连接到主机上,主机肯定是发现不了板卡的,主机应用程序也就无法和板卡进行通信。

所以我将\tools\boot_loader\ibl\src\device\c66x里面的c66xinit.c代码中void iblEnterRom ()函数进行了修改,将此函数内的iblPCIeWorkaround()提前到

if ( (BOOT_READ_BITFIELD(bm_lo,3,1) != 0x5) || (BOOT_READ_BITFIELD(bm_hi,3,3) == 0x0) ) /* Not i2c boot or i2c boot with address 0x50 */函数之前,并将iblPCIeWorkaround()最后的

//DEVICE_REG32_W(MAGIC_ADDR, 0);

// waitForBoot(MAGIC_ADDR);

注释掉!   我以为这样就能使PCIe initial了,但重新编译烧写IBL发现还是不行,依然发现不了板卡。

我不知道我修改IBL的思路是否正确,想请教各位   能给出个详细的解决方法,解决板卡通过PCIe转接板与主机连接后加电自启动程序,使主机和DSP能通信!

不甚感激!!!

Andy Yin1:

回复 yong xu1:

您好,

你的第一个帖子中不是说已经按照demo实现了DSP与主机间的PCIe数据通信么,那应该早就可以在主机上枚举到PCIe板卡了。现在发现不了板卡的问题,是否由于更新IBL导致还是什么?

还有一点请教,你的第一个帖子已经实现了PCIe boot及数据通信,后面的问题搞得很晕呢。。。。。。

yong xu1:

回复 Andy Yin1:

Andy ,您好;

很抱歉由于我表述的不清晰给您造成的困扰!

关于第一个帖子,实现了PCIe boot和通信,具体是指:将评估板拨码开关拨成PCIe boot,板卡通过AMC转接板插入主机卡槽中,待主机加电后,主机可以发现该板卡,主机通过PCIe链路将DSP程序发送到 DSP的L2,并更新DSP的Magic Address,通过此过程DSP完成程序的加载并开始与主机进行数据通信。(该方法参考了bootloader中的pciedemo.c)

由于项目中,不允许通过PCIe链路将DSP程序发送到 DSP的L2,故必须将DSP的程序固化在DSP的flash中,实现DSP加电自启动程序。

我现在的思路是:

1.在IBL中加入PCIe配置,然后重新编译IBL,烧写到I2C EEPROM中;

2.将应用程序烧写到NOR flash中;

3.使用I2C EEPROM(IBL)+NOR flash方式启动。

我的困惑就是现在拨码开发必须拨成I2C EEPROM(IBL)+NOR flash方式启动,板卡插入主机卡槽,主机肯定是无法检测到硬件的,具体原因我想可能是由于IBL检测拨码开关不是PCIe启动方式,没有进行PCIe initial造成的。(即下图中在Boot mode判断走了—N—》分支,但PCIE init在PCIE boot判断之后)

所以我修改IBL代码,想把PCIE init部分提前到Boot Mode判断前,但mcsdk的IBL文件夹下没有工程文件,只有一系列的 .c文件,修改很困难,我在tools\boot_loader\ibl\src\device\c66x里面的c66xinit.c代码中void iblEnterRom ()函数里发现iblPCIeWorkaround()函数,采用了上个帖子方式进行了修改,重新编译并烧写IBL但依然发现不了硬件。

我想请问,我的思路是否正确? 同行中如何解决我遇到这种困难的?

感谢大家不吝赐教!

dennis wu:

回复 yong xu1:

1. 我认为你的思路没问题,但可能具体细节上有些出入,比如,你可以试试将iblPCIeWorkaround函数放在“if ( (BOOT_READ_BITFIELD(bm_lo,3,1) != 0x5) ||(BOOT_READ_BITFIELD(bm_hi,3,3) == 0x0) )…else…”判断的后面。因为这端代码里面有很重要的一步是重写了DEVICE_REG_DEVSTAT寄存器。我就是这么做的,而且是成功的。当然我修改了PCie的配置,自己写了一个函数。所以你放心的、坚定的把这条路走下去。

2. 如果还是有问题,你可以尝试对IBL源代码进行DEBUG。具体方法如下(来自TI E2E):  

As for debugging, the source code is available and so is the .out file. You can step through the code from CCS.

a)  To compile IBL with debug symbols you have to give the option DEBUG=yes while invoking the make command. While building with DEBUG option you may get linker failures due to memory region sizes defined in src\make\ibl_c66x\ibl_common.inc. Please increase/adjust the size depending on the link error. You can load the symbols from ibl_c66x_init.out (first stage IBL) & ibl_c66x.out (second stage IBL) for source debugging.

b)   The "make" process does more than just creating ELF executables. If you observe, the output file which you flash on the eeprom is not an ELF file, but its an EEPROM image file (in boot table format) which is loadable by the ROM bootloader.  The  2 out files(ibl_c66x_init.out, ibl_c66x.out) along with some other information are converted into " boot table" format and laid out as a EEPROM image.

c)  Are you not able to proceed with source debugging by manually locating the source file for CCS. This can be done by clicking the "locate file" button in the CCS source browser window.

希望可以帮到你。

yong xu1:

回复 dennis wu:

您好!

您说您将iblPCIeWorkaround函数放在“if ( (BOOT_READ_BITFIELD(bm_lo,3,1) != 0x5) ||(BOOT_READ_BITFIELD(bm_hi,3,3) == 0x0) )…else…”判断的后面。

我想知道此时您的拨码开发是I2C EEPROM(IBL)+NOR flash方式吧?如果是,我的理解该if条件就不会执行了,就会直接执行else语句了

(即DEVICE_REG32_W (DEVICE_REG_DEVSTAT, ((bm_hi << 8) | bm_lo));)。我的理解正确吗??

我 尝试了将iblPCIeWorkaround函数放在“if ( (BOOT_READ_BITFIELD(bm_lo,3,1) != 0x5) ||(BOOT_READ_BITFIELD(bm_hi,3,3) == 0x0) )…else…”判断的后面,重新烧写进入EEPROM后,将拨码开关设置为I2C EEPROM(IBL)+NOR flash,但nor flash的程序不能启动。

您说您修改了PCIe的配置,自己写了个函数。不知道您能否指点一二,将此函数共享呢?

不甚感激!

赞(0)
未经允许不得转载:TI中文支持网 » PCIe启动过程中C6678程序加载
分享到: 更多 (0)