This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3352的外设mcasp 能否多次动态修改其配置属性?

Other Parts Discussed in Thread: AM3352

问题1:        当前我们将mcasp 作为外设获取FPGA送过来的数据,FPGA同时支持Burst和IIC两种数据传输,应用层可以通过MCU总线访问fpga register来动态修改FPGA送往mcasp的数据类型,那么AM3352的mcasp是否可以不重启AM335x情况下,是否支持多次动态修改其接口配置属性呢?(当前使用linux3.2.0,  自己编写的mcasp.ko驱动,通过insmod 动态插入到内核)

问题2:如果问题1成立支持动态配置mcasp外设的属性, 当前我遇到一个问题,第一次配置mcasp burust mode,工作正常, 再第二次配置mcasp时,GBLCTRL register无法写入0,读取寄存器结果是0x4, 表明serialer is active. 问题是第二次配置时无法software reset mcasp, 只有power on/off, hot reset才能解决这个问题。请大神帮忙分析下?

我把配置的代码贴出来 如下:

void mcasp_conf_busrtmode(void __iomem * io_mem)
{
u32 flag;

PRINT_FN_IN
/*************************RFIFOCTL Register **********************************/
/*a word count per dma event, a word count per transfer*/
mcasp_set_reg(io_mem + MCASP_RFIFOCTL, 0x0);

/***********************reset ***********************************************/
mcasp_set_reg(io_mem + MCASP_GBLCTL, 0x0);
flag=mcasp_get_reg(io_mem + MCASP_GBLCTL);
while(flag!=0)                                                                            //动态第二次reset mcasp接口时,MCASP_GBLCTRL无法初始化为0
{
flag=mcasp_get_reg(io_mem + MCASP_GBLCTL);
}

/************************Receiver port configuration***************************/
mcasp_set_reg(io_mem + MCASP_RMASK, 0x000FFFFF);

//mcasp_set_reg(io_mem + MCASP_RFMT, 0x00018070);
/*1 bit delay;MSB first;20bit;pad value 0 ;conf_bus[0] [1]*/
mcasp_set_reg(io_mem + MCASP_RFMT, 0x00018091);

//mcasp_set_reg(io_mem + MCASP_AFSRCTL, 0x00000000);
/*Burst mode,single bit width;external FS;rising edge begin a frame--1;rising edge----0*/
mcasp_set_reg(io_mem + MCASP_AFSRCTL, 0x00000000);


//receive clock control register
mcasp_set_reg(io_mem + MCASP_ACLKRCTL, 0x00000080);

//mcasp_set_reg(io_mem + MCASP_RTDM, 0x1);
/*slot 1 is active; CSL_MCASP_RTDM_RTDMS_MASK; //all slot is active*/
mcasp_set_reg(io_mem + MCASP_RTDM, 0x1);

//enable the receiver interrupt control for mcasp
mcasp_set_reg(io_mem + MCASP_RINTCTL, 0xBF);

/*serializer control register, Serializer is receiver*/
mcasp_set_reg(io_mem + MCASP_SRCTL(0), MCASP_SRCTL_SRMOD_RX);
mcasp_set_reg(io_mem + MCASP_SRCTL(1), MCASP_SRCTL_SRMOD_RX);

/************************mcasp pin configuration***************************/
/*fsr;axr0;axr1;aclkr*/
mcasp_clr_bits(io_mem + MCASP_PFUNC, MCASP_PFUNC_AFSR |MCASP_PFUNC_ACLKR |MCASP_PFUNC_AXR0 |MCASP_PFUNC_AXR1);
mcasp_clr_bits(io_mem + MCASP_PDIR, MCASP_PFUNC_AFSR |MCASP_PFUNC_ACLKR |MCASP_PFUNC_AXR0 |MCASP_PFUNC_AXR1);


/************************Receiver Status Register***************************/
mcasp_set_reg(io_mem + MCASP_XSTAT, 0xFFFF);
mcasp_set_reg(io_mem + MCASP_RSTAT, 0xFFFF);


/************************Receiver Global Control Register**************************/
mcasp_set_reg(io_mem + MCASP_RGBLCTL,
mcasp_get_reg(io_mem + MCASP_RGBLCTL)|0x04); // RSRCLR XSRCLR1
flag=mcasp_get_reg(io_mem + MCASP_RGBLCTL);
while((flag & 0x04) ==0)
{
flag=mcasp_get_reg(io_mem + MCASP_RGBLCTL);
};


/************************state machine reset**************************/
mcasp_set_reg(io_mem + MCASP_RGBLCTL,
mcasp_get_reg(io_mem + MCASP_RGBLCTL)|0x08); // RSMRST XSMRST
flag=mcasp_get_reg(io_mem + MCASP_RGBLCTL);
while((flag & 0x08) ==0)
{
flag=mcasp_get_reg(io_mem + MCASP_RGBLCTL);
};

/************************synchronized fram reset**************************/
mcasp_set_reg(io_mem + MCASP_RGBLCTL,
mcasp_get_reg(io_mem + MCASP_RGBLCTL)|0x10); // XFST RFRST
flag=mcasp_get_reg(io_mem + MCASP_RGBLCTL);
while((flag & 0x10) ==0)
{
flag=mcasp_get_reg(io_mem + MCASP_RGBLCTL);
};

PRINT_FN_OUT
}