问题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
}