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

SRIO的相关问题,当我在main函数中初始化了SRIO_init函数,SRIO的中断初始化写在main中,程序执行之后,执行先执行pcie的中断,pcie的ISE中,又对PCIE执行了srio_init函数,这会影响srio的中断触发吗?如果影响可以将srio中断的初始化写到pcie的ISR中吗?

main函数

Int main(Int argc, Char* argv[])
{
//clear PCIE interrupt MSI0 and INTA, because boot loader need interrupt to weak up DSP to run.
//Boot loader step :
//1. load section to memory
//2. write MAGIC_ADDR with boot entry address
//3. send interrupt to DSP(MSI0 or INTA etc)
UInt32 k[100] = {0};
UInt32 g = 0,j = 0;
DEVICE_REG32_W(MSI0_IRQ_STATUS, 0x1);
DEVICE_REG32_W(PCIE_LEGACY_A_IRQ_STATUS, 0x1);
DEVICE_REG32_W(PCIE_IRQ_EOI, 0x0);

//时钟初始化
TSC_init();

//unused
DEVICE_REG32_W(0x1087fffc, (uint32_t)&_c_int00);
write_boot_magic_number();
//安装主机中断………..
InitHostInt();

//Srio模块初始化(包括pll,qmss、pktdma、DDR3, TSC,Gpio)
EDMA_init();
//DSP core speed: 100*10/1=1000MHz,仅需主核初始化
//KeyStone_main_PLL_init(100, 10, 1);
KeyStone_main_PLL_init(312.5, 32, 10);
//该函数配置参数需要修改
KeyStone_DDR_init (1000,2, 2, NULL);
//KeyStone_DDR_init (66.66667, 16, 1, NULL);

if(SrioInit() < 0)
{
return -1;
}

/* Initialize the SRIO Driver */
if (Srio_init () < 0)
{
System_printf ("Error: SRIO Driver Initialization Failed\n");
return -1;
}

//maokai:动态加载GPIO初始化
GPIO_init_mk();

//初始化SRIO Socket驱动
InitSrioDriver();

//Lsu0_Init();

//
//maokai:translate the BARs to local RAM
ConfigPcieInBound_mk();

//创建任务前必须先进行SRIO\PCIE\EDMA\DDR3等外围接口及设备初始化
//CreateTask();

//通知主机DSP初始化完成
DEVICE_REG32_W(0x10800000, 0x0C11FC00);
//BIOS_start();
//TSC_delay_ms(30000);
while(1)

pcie的ISR

printf("DSP receives interrupt from host.\n");
Int32 i=0,j=0,k=0,h=0,q=0;
Int32 Flag = 0;
/* Disable host interrupt */
CSL_CPINTC_disableHostInterrupt (hnd, HOST_INT_NUM_CIC0_PCIE);

/* clear PCIE interrupt */
DEVICE_REG32_W(PCIE_LEGACY_A_IRQ_STATUS, 0x1);
DEVICE_REG32_W(PCIE_IRQ_EOI, 0x0);

// Clears the system interrupt
CSL_CPINTC_clearSysInterrupt (hnd, PCIEXpress_Legacy_INTA);
CSL_CPINTC_enableHostInterrupt (hnd, HOST_INT_NUM_CIC0_PCIE);

/* do operations */

//………………………………

//Host_To_Dsp_isr_Func(arg); //this function may be in other file.

UInt32 Pcie_Mode = DEVICE_REG32_R(0x10800008);//;
UInt32 Cpu_data_length = DEVICE_REG32_R(0x1080000C);//DEVICE_REG32_R(0x8200000C);
UInt32 Cpu_data_srcaddr = 0x82000100;
UInt32 Cpu_data_dstaddr = 0x00000000;

UInt32 DSP_Read_FPGA_srcaddr = DEVICE_REG32_R(0x10800018);
UInt32 DSP_Read_FPGA_dstaddr = 0x10800010;

if(Pcie_Mode == 1)
{

i = 0xABAB4141;
DEVICE_REG32_W(0x10800040,i);
Pciedma_Srio_mk();
SendInterruptToHost();
//Dsp_config_fpga_mk();
printf("mode 1 over\n");
}
else if(Pcie_Mode == 2)
{
if(Cpu_data_length != 0)
{
Flag++;
DEVICE_REG32_W(0x10800044,j);
WriteFpgaByDioSockets_nwrite_mk (Cpu_data_dstaddr,(Uint8*) Cpu_data_srcaddr,8*Cpu_data_length);
if(Flag == 2){
//q = DEVICE_REG32_R(0x80000040);
q = 0;
DEVICE_REG32_W(0x10800080,Flag);
}
SendInterruptToHost();
printf("mode 2 over\n");
}
else
{
j++;
DEVICE_REG32_W(0x10800050,j);
SendInterruptToHost();
//ClearInterruptToHost();
}
}
else if(Pcie_Mode == 3)
{
k++;
DEVICE_REG32_W(0x10800048,k);
Dsp_config_fpga_mk();
TSC_delay_ms(1000);
SrioInit();
printf("mode 3 over\n");
}
else if(Pcie_Mode == 4)
{
h++;
DEVICE_REG32_W(0x1080004C,h);
ReadFpgaByDioSockets (DSP_Read_FPGA_srcaddr,(Uint8*) DSP_Read_FPGA_dstaddr,8);
SendInterruptToHost();
//ClearInterruptToHost();
printf("mode 4 over\n");
}

Shine:

请问为什么要把初始化放在中断里完成?可以放在主函数里完成,一般中断子程序里处理的事情越少越好。

user5301336:

回复 Shine:

好的,还有个问题,我是最后执行Pcie_Mode == 1,我能在这个里面禁止pcie的中断,去执行SRIO的ISR吗?

赞(0)
未经允许不得转载:TI中文支持网 » SRIO的相关问题,当我在main函数中初始化了SRIO_init函数,SRIO的中断初始化写在main中,程序执行之后,执行先执行pcie的中断,pcie的ISE中,又对PCIE执行了srio_init函数,这会影响srio的中断触发吗?如果影响可以将srio中断的初始化写到pcie的ISR中吗?
分享到: 更多 (0)