共1条
1/1 1 跳转至页
[讨论]ppc860t 的串行调试和scc3,4的中断冲突解决(老站转)
ppc860t 的串行调试和scc3,4的中断冲突解决
gao 于 2002/04/15 15:41 加贴在 嵌入式系统论坛 设为精华 删除
贴子主题:小弟恳请各位大虾帮忙!ppc860t 的串行调试和scc3,4的中断有冲突??*(十万火急)
飞扬
工程师
来自:
发表总数:13
查看 短消息 电子邮件 OICQ 引用 回复
--------------------------------------------------------------------------------
ppc860t 的串行调试和scc3,4的中断有冲突??
小弟在TORNADO下的一个bsp。用scc1做串口调试. scc3.4开64个信道传送数据,接收到数据到缓冲区之后,应该通过cpm产生中断,调用中断服务程序,但是却没有,终端循环队列里有scc3,4产生的中断,中断号和原因都对,但是服务程序却没有响应。
后来关掉WDB之后,可以进入中断服务程序,又没法调试。要改为FEC方式调试,会很麻烦。求教各位大虾,一定要帮助小弟啊!
小弟刚工作半年多点,仰仗各位了!!!!!!!!
zwb781023@sohu.com, qq:23775835.
--------------------------------------------------------------------------------
编辑 发表於:2002-04-07 - 16:39:57 IP: 10.7.*.*
飞扬
工程师
来自:
发表总数:13
查看 短消息 电子邮件 OICQ 引用 回复
--------------------------------------------------------------------------------
难道没人肯帮小弟一把???
--------------------------------------------------------------------------------
编辑 发表於:2002-04-08 - 18:15:50 IP: 10.7.*.*
hongwind
高级工程师
来自:
发表总数:101
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
可以把你初始化,链接中断服务程序的代码贴出来吗,这样大家也可以看看,不然谁知道到底是怎么回事呢?
--------------------------------------------------------------------------------
编辑 发表於:2002-04-08 - 21:00:07 IP: 61.177.*.*
hongwind
高级工程师
来自:
发表总数:101
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
希望对你有用了。
串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗
串口驱动(Serial Drivers)编写实例解读(连载:一)
[代码步骤:Code Steps]
。初始化
。定义支持的串口通道数
。初始化驱动的设备描述
。写你的设备初始化代码
。写入口程序(entry point routines)
。写ISRs(中断服务程序)来管理设备
。使用模板 wind/target/src/drv/ssio/templateSio.c
注意:串口驱动在VxWorks系统开始的代码里初始化
[设备描述:The Device Descriptor]
。XX_DRV结构每个通道有一个XX_CHAN
。每个XX_CHAN指向SIO_DRV_FUNCS
。SIO_DRV_FUNCS引诱驱动的入口(entry point)
。XX_DRV是xxDrv使用的中心数据结构
。xx_CHAN包括:
。xxDrv需要的通道特定信息
。指向驱动SIO_DRV_FUNCS结构的指针
。例:
/* device and channel structures */
typedef struct
{
/* must be first */
SIO_CHAN sio; /* standard SIO_CHAN element */
/* callbacks */
STATUS (*getTxChar) ();
STATUS (*putRcvChar) ();
void * getTxArg;
void * putRcvArg;
/* register addresses */
volatile char * cr; /* channel control register */
volatile char * dr; /* channel data register */
volatile char * sr; /* channel status register */
volatile char * ms; /* channel modem status register */
volatile char * mc; /* channel modem control register */
volatile short * br; /* channel baud constant register */
/* misc */
int mode; /* current mode (interrupt or poll) */
int baudFreq; /* input clock frequency */
int options; /* Hardware options */
} TEMPLATE_CHAN;
typedef struct
{
TEMPLATE_CHAN portA; /* DUSRAT has two channels */
TEMPLATE_CHAN portB;
volatile char * masterCr; /* master control register */
} TEMPLATE_DUSART;
[SIO_CHAN结构]
。对一般字符驱动,一个指向DEV_FDR的指针被用来在驱动和I/O system 之间通讯
。对一个串口驱动,一个指向SIO_CHAN的指针用来在驱动和高层协议之间通讯
在 wind/target/h/sioLib.h;里,SIO_CHAN如下定义:
typedef struct sio_chan/* a serial channel */
{
SIO_DRV_FUNCS * pDrvFuncs;
/* device data */
} SIO_CHAN;
.由于高层协议不知道驱动的XX_CHAN结构,SIO_CHAN被用来允许一个精心定义的数据类型在协议间交换数据
.ttyDrv通过SIO_DRV_FUNCS里的入口向xxDrv发送信息,而xxDrv通过回调向ttyDrv发送信息
[入口:Entry Points]
xxCallBackInstall() 安装到高层协议的入口(I/O system,target agent(目标代理),等等)
xxPollOutPut() 轮巡模式输出
xxPollInput() 轮巡模式输入
xxIoctl() 支持设备特定的ioctl命令
xxTxStaartup() 初始化一个传输循环(transmit cycle)
[驱动回调安装程序]
int xxCallbackInstall(pSsioChan,callbackType,callback,callbbackArg)
pSioChan 指向SIO_CHAN的指针
callbackType SIO_CALLBACK_GET_TX_CHAR 或 SIO_CALLBACK_PUT_RCV_CHAR
callback 指向回调程序的指针
callbackArg 回调的参数
。初始化SIO_CHAN结构里的特定成员
。返回OK 或 ENOSYS(当callbackType不是上两种中的一种)
/********************************************************************************
templateCallbackInstall - install ISR callbacks to get/put chars
This driver allows interrupt callbacks for transmitting characters
and receiving characters. In general, drivers may support other
types of callbacks too.
*
* RETURNS: OK on success, or ENOSYS for an unsupported callback type.*/
LOCAL int templateCallbackInstall
(
SIO_CHAN * pSioChan, /* channel */
int callbackType, /* type of callback */
STATUS (*callback)(), /* callback */
void * callbackArg /* parameter to callback */
)
{
TEMPLATE_CHAN * pChan = (TEMPLATE_CHAN *)pSioChan;
switch (callbackType)
{
case SIO_CALLBACK_GET_TX_CHAR:
pChan->getTxChar = callback;
pChan->getTxArg = callbackArg;
return (OK);
case SIO_CALLBACK_PUT_RCV_CHAR:
pChan->putRcvChar = callback;
pChan->putRcvArg = callbackArg;
return (OK);
default:
return (ENOSYS);
}
}
[驱动初始化]
。参数是没一个指向XX_DRV的指针
。初始化XX_CHAN
。带你的程序的SIO_DRV_FUNCS
。傀儡回调
。所有设备特定
。重启芯片
/* local variables */
LOCAL SIO_DRV_FUNCS templateSioDrvFuncs =
{
templateIoctl,
templateTxStartup,
templateCallbackInstall,
templatePollInput,
templatePollOutput
};
void templateDevInit
(
TEMPLATE_DUSART * pDusart
)
{
/* initialize each channel`s driver function pointers */
pDusart->portA.sio.pDrvFuncs = &templateSioDrvFuncs;
pDusart->portB.sio.pDrvFuncs = &templateSioDrvFuncs;
/* install dummy driver callbacks */
pDusart->portA.getTxChar = dummyCallback;
pDusart->portA.putRcvChar = dummyCallback;
pDusart->portB.getTxChar = dummyCallback;
pDusart->portB.putRcvChar = dummyCallback;
/* reset the chip */
TEMPLATE_REG_WRITE(pDusart, masterCr,
TEMPLATE_RESET_CHIP);
/* setting polled mode is one way to make the device quiet */
templateIoctl ((SIO_CHAN *)&pDusart->portA, SIO_MODE_SET,
(void *)SIO_MODE_POLL);
templateIoctl ((SIO_CHAN *)&pDusart->portB, SIO_MODE_SET,
(void *)SIO_MODE_POLL);
}
/*******************************************************************************
*
* dummyCallback - dummy callback routine
*
* RETURNS: ERROR.
*/
LOCAL STATUS dummyCallback (void)
{
return (ERROR);
}
※ 作 者: 自由妹妹 01-5-22 下午 05:10:58 ※
已拜读,请教! <--- 〖回复该帖子〗
我发现在usrSerial.c中定义了TY_NAME_BASE `/tyCo/`
如果我使用scc3做uart串口,设备名是否只能为`/tyCo/x`形式?
还是任意取名tty 设备名,然后该设备名通过一个SIO_CHAN,在xxCallbackInstall函数中传给上层协议,
上层在通过SIO_CHAN调用IOCTL来控制串口驱动.
请你指教,谢谢!
※ 作 者: little 01-5-23 下午 02:31:59 ※
reply little <--- 〖回复该帖子〗
Little:
设备名只要是唯一的就可以了...
另,你用scc3做uart一定使用st16c552或者st16c554吧?
我现有st16c552(可扩展两个串口)的完全驱动程序.正开发st16c554(带4个 ACE,可扩展4个串口)的驱动,
欢迎多多交流...
※ 作 者: 自由妹妹 01-5-23 下午 02:59:45 ※
re:自由妹妹 <--- 〖回复该帖子〗
我用的是860t的scc,不是16552串口芯片.
不过,我对16554很熟,我以前写过串口卡的驱动.
※ 作 者: little 01-5-23 下午 04:11:30 ※
To Dear Little <--- 〖回复该帖子〗
Little哥哥:
太好了,居然找到一个做相同工作的同道,呜呜(感动得泣不成声)。
小妹现正在搞16c554的驱动程序.
860的scc可以扩展4个串口,smc可以扩展两个,但是我们的板子需要更多(8个),所以决定用两个16c554.
你能给我一些写16554驱动的心得和资料吗?谢谢...
※ 作 者: 自由妹妹 01-5-23 下午 08:18:38 ※
To Dear Little <--- 〖回复该帖子〗
关于硬件的问题可以问我,因为我身边有一个比较厉害的博士后.
※ 作 者: 自由妹妹 01-5-23 下午 10:13:43 ※
send me E-mail! <--- 〖回复该帖子〗
我有些忙,你用?cpu,我把E-mail地址给你,请你和我联系,好吗?
psos@telekbird.com.cn.
QQ:67511196
※ 作 者: little 01-5-26 上午 10:06:43 ※
Re:reply little <--- 〖回复该帖子〗
这么基础的东西都不会,是不是刚入门呀!本人写过不少VXWORKS、PSOS的驱动程序,有些很复杂,有空和大家交流一下,比如多通道HDLC、DMA、100M、PPP等.
dc_peng@hotmail.com
※ 作 者: duccy 01-6-5 上午 10:44:43 ※
Re:Re:reply little <--- 〖回复该帖子〗
我可以问一个很才的问题吧!
在vxworks下面怎么和串口进行通讯,希望能帮我
谢谢、11
※ 作 者: nhqing 01-7-9 下午 01:41:21 ※
Re:reply little <--- 〖回复该帖子〗
自由妹妹姐姐,我可以问你一个问题吗
※ 作 者: 陈虹 01-6-6 下午 04:10:29 ※
Re:串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗
自由妹妹:
拜读了您的程序,受益良多,我想问如果是用1655X系列作的扩展串口卡,可不可以将Vxworks的标准串中驱动直接扩展到自己卡上用呢?
※ 作 者: 化民 01-5-28 上午 07:39:13 ※
Re:Re:串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗
化民:
VXworks标准的串口驱动是采用SMC(串口通讯控制器)的两个通道,1655x的机制与之不同,故虽然其驱动程序架构相同,但实现起来差异较大.
我现在在把SMC和16c554整合到一起,而且现在已经有阶段性成果,希望我们可以多交流...
另外,我很快会推出一篇关于这个的文章(顺便回击一下论坛上某些人对我的指责),请期待...
自由妹妹
※ 作 者: 自由妹妹 01-5-28 下午 10:23:03 ※
Re:Re:Re:串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗
我也要用到166C554,166654;请各位大虾指教!能否赠阅部分心得或原程序!
※ 作 者: sleac 01-5-29 下午 06:06:24 ※
Re:串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗
大家好,看了大家的高作,有找到亲人的感觉,我现在正在vxworks下进行协议开发,但是对vxworks的机制很是不熟,在对串口驱动的开发中,我扩展了12个串口(用3片16c554),利用epld进行地址译码(地址0x1000开始),中断的合并(把16c554的12个中断合成一个x86的中断),完全按照汇编的方式对串口进行编程。我想做成标准的驱动程序的方式,请大家多多指导。
我的程序如下,有些语句是调试用的,没有一一去掉,请多包涵:
/*初始化函数,iosign为第几个串口,0--11)*/
void comini(int iosign)
{
/*清空原来状态*/
sysInByte(0x1000*iosign+0x1100+lsr);/*read LSR*/
sysInByte(0x1000*iosign+0x1100+msr);/*READ MSR*/
sysInByte(0x1000*iosign+0x1100+iir);/*READ IIR*/
sysInByte(0x1000*iosign+0x1100+rbr);/*READ RBR*/
sysOutByte(0x1000*iosign+0x1100+lcr,0); /* DLAB=0 */
sysOutByte(0x1000*iosign+0x1100+ier,0); /* CLOSE INT */
sysInByte(0x1000*iosign+0x1100+lsr);/*read LSR*/
sysInByte(0x1000*iosign+0x1100+msr);/*READ MSR*/
sysInByte(0x1000*iosign+0x1100+iir);/*READ IIR*/
sysInByte(0x1000*iosign+0x1100+rbr);/*READ RBR*/
sysOutByte(0x1000*iosign+0x1100+lcr,0x80);/*set DLAB=1*/
sysOutByte(0x1000*iosign+0x1100+dlm,0);/*DLM=0*/
sysOutByte(0x1000*iosign+0x1100+dll,0x30);/*DLL=0x0c,set 9600*/
sysOutByte(0x1000*iosign+0x1100+lcr,0x03);/*set n,8,1*/
sysOutByte(0x1000*iosign+0x1100+mcr,0x0b);/*mcr=0x0b,P527*/
sysInByte(0x1000*iosign+0x1100+lsr);/*read LSR*/
sysInByte(0x1000*iosign+0x1100+msr);/*READ MSR*/
sysInByte(0x1000*iosign+0x1100+iir);/*READ IIR*/
sysInByte(0x1000*iosign+0x1100+rbr);/*READ RBR*/
#ifndef ENABLE_FOLLOW
sysOutByte(0x1000*iosign+0x1100+ier,0x03);
#else
sysOutByte(0x1000*iosign+0x1100+ier,0x0b);
#endif
}
再在初始化中循环调用12次,12个串口的初始化就能完成。
用 vectot7 = INUM_TO_IVEC((INT_NUM_IRQ0)+7);
intConnect(vectot7,FunIRQ7,0);
把中断7定向到函数FunIRQ7(),这个函数处理8个串口,另外4个类似
void FunIRQ7() /*com0--7*/
{
unsigned char temp;
#ifdef ENABLE_FOLLOW
unsigned char mymsr;
#endif
int mycnt;
int ionumber;
int i;
unsigned char _flag;
for(i=0;i<=7;i++)
_flag[i]=sysInByte(0x1000*i+0x1100+iir);
do
{
for(ionumber=0;ionumber<=7;ionumber++)
{
if((_flag[ionumber]&0x01)==0)
{
do
{
switch(_flag[ionumber]&0x0f)
{
#ifdef ENABLE_FOLLOW
case 0:
/*处理流控*/
break;
#endif
case 4:
case 12:
/*接收数据*/
break;
case 2:
/*发送数据*/
break;
default:
break;
}
}while(((_flag[ionumber]=sysInByte(0x1000*ionumber+0x1100+iir))&0x01)==0);
}
}
for(i=0;i<=7;i++)
_flag[i]=sysInByte(0x1000*i+0x1100+iir);
}while(((_flag[0]&0x01)==0)||((_flag[1]&0x01)==0)||((_flag[2]&0x01)==0)\||((_flag[3]&0x01)==0)||((_flag[4]&0x01)==0)||((_flag[5]&0x01)==0)\||((_flag[6]&0x01)==0)||((_flag[7]&0x01)==0));
}
希望大家多联系,freedom_zj@163.com
--------------------------------------------------------------------------------
编辑 发表於:2002-04-08 - 21:02:58 IP: 61.177.*.*
飞扬
工程师
来自:
发表总数:13
查看 短消息 电子邮件 OICQ 引用 回复
--------------------------------------------------------------------------------
hongwind 兄:你好!我现在把我的config.h贴出来,请你看看有什么毛病,另外,我的以太网口用的lxt972。硬件自协商方式,是不是还要在syslib。c里加上对MII控制寄存器的配置啊?好象是不需要程序配置的,但我看文档上说得好象是必需的。
Selecting the Interface
The MPC860T provides support for MII and 7-pin interfaces. The mode is controlled by bit 29
(MII_MODE) of the Receive Control (R_CNTRL) register.
• Set bit 29 = 1 to select MII mode for 10/100M.
我用的是fec。另外还有860t的寄存器ECNTRL里的FEC_PINMUX FEC enable,ETHER_EN Ethernet enable。这些都应该设的吧?我没有860t fec的bsp,所以一切都很迷茫。万望指教。 下面是config.h,我自己改的。
#ifndef INCconfigh
#define INCconfigh
/* BSP version/revision identification, should be placed
* before #include `configAll.h`
*/
#define BSP_VER_1_1 1
#define BSP_VERSION `1.1`
#define BSP_REV `/2` /* 0 for the first bsp revision */
#include `configAll.h`
#define INCLUDE_STAT_SYM_TBL
#define CTC_860T /* define it in the case of a CTC860T */
#ifdef CTC_860T
#define DEFAULT_BOOT_LINE \
`motfec(0,0)host:/usr/vw/config/fec/vxWorks h=10.7.201.198 e=10.7.201.111 u=target`
#else /* CPM_860T */
#define DEFAULT_BOOT_LINE \
`cpm(0,0)host:/usr/vw/config/ads860/vxWorks h=90.0.0.3 e=90.0.0.50 u=target`
#endif /* CTC_860T */
/* Number of TTY definition */
#define N_SIO_CHANNELS 1 /* No. serial I/O channels zwb */
#undef NUM_TTY
#define NUM_TTY N_SIO_CHANNELS
/*
**2001.10.11 added for windview
*/
/*#undef INCLUDE_WINDVIEW */
#define INCLUDE_SHELL /* zwbd 02.4.3*/
/* #define INCLUDE_USER_APPL */
#undef EDO_DRAM /* to define if the DRAM is EDO */
#undef INCLUDE_TIMESTAMP /* no timestamp driver support */
/* Cache and MMU not supported */
#undef INCLUDE_CACHE_SUPPORT /* no cacheLib support */
#undef USER_I_CACHE_ENABLE
#undef USER_I_CACHE_MODE
#define USER_I_CACHE_MODE CACHE_DISABLED
#undef USER_D_CACHE_ENABLE
#undef USER_D_CACHE_MODE
#define USER_D_CACHE_MODE CACHE_DISABLED
#undef USER_B_CACHE_ENABLE
/* MMU configuration */
#undef INCLUDE_MMU_BASIC /* no MMU support */
#undef INCLUDE_MMU_FULL /* no MMU support */
#undef USER_I_MMU_ENABLE
#undef USER_D_MMU_ENABLE
/*Network driver configuration */
#define INCLUDE_ICMP /*zwbr 02.4.3*/
#define INCLUDE_TELNET /*zwbr 02.4.3*/
#define FOLDER_TCPIP_CONFIG /*zwbr 02.4.3*/
#define FOLDER_TCP_IP /*zwbr 02.4.3*/
#define INCLUDE_BSD_SOCKET /*zwbr 02.4.3*/
#define INCLUDE_BSD /*zwbr 02.4.3*/
#define INCLUDE_TCP /*zwbr 02.4.3*/
#define INCLUDE_IP /* zwbr 02.4.3*/
#define INCLUDE_NET_SETUP /*zwbr 02.4.3*/
#define INCLUDE_NETWORK /* zwbr 02.3.5*/
#define INCLUDE_NET_INIT /*zwbr 02.3.20 */
#undef INCLUDE_EX
#undef INCLUDE_ENP
#undef INCLUDE_SM_NET
/* Enhanced Network Driver (END) support */
#define INCLUDE_END /* Enhanced Network Driver (see configNet.h) zwbr 02.3.6*/
#undef END_OVERRIDE /* define if you are using old boot ROMs. */
#undef INCLUDE_VME
/* Optional timestamp support */
#undef INCLUDE_TIMESTAMP
/* clock rates */
/* SYS_CLK_RATE_MIN/MAX used in sysClkRateSet() in target\src\drv\timer\ppcDecTimer.c */
#define SYS_CLK_RATE_MIN 3 /* minimum system clock rate */
#define SYS_CLK_RATE_MAX 5000 /* maximum system clock rate */
#define AUX_CLK_RATE_MIN 3 /* minimum auxiliary clock rate */
#define AUX_CLK_RATE_MAX 5000 /* maximum auxiliary clock rate */
/*
* Cristal Frequency - This macro defines the input oscillator frequency
* clocking the PPC860.
*/
#define CRISTAL_FREQ 4000000 /* 4 Mhz */
#define FREQ_20_MHZ 20000000 /* 20 Mhz */
#define FREQ_25_MHZ 25000000 /* 25 Mhz */
#define FREQ_50_MHZ 50000000 /* 50 Mhz */
/*
* SPLL_FREQ_REQUESTED - This macro defined the expected system PLL (SPLL)
* frequency divided by 2. The two supported frequencies are either 25
* or 50 MHz.
*/
#define SPLL_FREQ_REQUESTED FREQ_50_MHZ /* 50 Mhz */
/*
* DRAM refresh frequency - This macro defines the DRAM refresh frequency.
* e.i: A DRAM with 1024 rows to refresh in 16ms:
* DRAM_REFRESH_FREQ = 1024/ 16E-3 = 64E3 hz
*/
#define DRAM_REFRESH_FREQ 64000 /* 64 kHz */
/*
* Baud Rate Generator division factor - 0 for division by 1
* 1 for division by 4
* 2 for division by 16
* 3 for division by 64
*/
#define BRGCLK_DIV_FACTOR 0
/* remove unnecessary drivers */
#undef INCLUDE_CPM /* exclude the CPM ethernet driver zwb? 02.3.20*/
#undef INCLUDE_BP
#undef INCLUDE_EX
#undef INCLUDE_ENP
#undef INCLUDE_SM_NET
#undef INCLUDE_SM_SEQ_ADD
/*#undef INCLUDE_NET_INIT ZWBD 02.4.3*/
#ifdef CTC_860T
#ifdef INCLUDE_NETWORK
#define INCLUDE_MOT_FEC /* define if you are using the FEC. */
#endif /* INCLUDE_NETWORK */
#undef INCLUDE_CPM /* define, if you want to use the */
/* CPM ethernet driver */
#undef USER_D_CACHE_ENABLE /* data cache not supported for now */
#else /* CTC_860T */
#undef INCLUDE_MOT_FEC /* define if you are using the FEC. */
#ifdef INCLUDE_NETWORK
#define INCLUDE_CPM /* include the CPM ethernet driver */
#endif /* INCLUDE_NETWORK */
#endif /* CTC_860T */
#ifdef INCLUDE_MOT_FEC
#ifndef INCLUDE_END
#define INCLUDE_END /* define if you are using the FEC */
#endif /* INCLUDE_END */
#endif /* INCLUDE_MOT_FEC */
/* Memory addresses */
#define LOCAL_MEM_LOCAL_ADRS 0x00000000 /* Base of RAM */
#define LOCAL_MEM_SIZE 0x02000000 /* 32 Mbyte memory available */
/*
* The constants ROM_TEXT_ADRS, ROM_SIZE, and RAM_HIGH_ADRS are defined
* in config.h, MakeSkel, Makefile, and Makefile.*
* All definitions for these constants must be identical.
*/
#define ROM_BASE_ADRS 0xFFF00000 /* base address of ROM */
#define ROM_TEXT_ADRS ROM_BASE_ADRS + 0x100
#define ROM_SIZE 0x000FFFFF /* 1024 K ROM space */
/* RAM address for ROM boot */
#define RAM_HIGH_ADRS (LOCAL_MEM_LOCAL_ADRS + 0x00800100)
/* RAM address for sys image */
#define RAM_LOW_ADRS (LOCAL_MEM_LOCAL_ADRS + 0x00100100)
/*#ifdef ROM_RESIDENT zwb 02.03.20*/
/* since rules.bsp build vxworks.res_rom using RES_LOW_FLAGS (== -Ttext $(ROM_TEXT_ADRS) -Tdata $(RAM_LOW_ADRS)),
and in bootinit.c romstart() routine, copy data segment from ROM to RAM`s adress RESIDENT_DATA ( defined to be
RAM_DST_ADRS in bootinit.c), so, make RAM_DST_ADRS to be RAM_LOW_ADRS to be consistent ). */
/*
#define RAM_DST_ADRS RAM_LOW_ADRS
#else
#define RAM_DST_ADRS RAM_HIGH_ADRS
#endif
*/
#define USER_RESERVED_MEM 0x00000000 /* user reserved memory size */
/*
* Default power management mode - selected via vxPowerModeSet() in
* sysHwInit().
*/
#define DEFAULT_POWER_MGT_MODE VX_POWER_MODE_DISABLE
#define BUS 0 /* bus-less board */
#define CPU PPC860 /* CPU type */
/*
* SPLL Multiplication Factor: use to set the MF bits of the PLPRCR register.
* PLPRCR is set by sysHwInit() in sysLib.c.
* SPLL_FREQ_REQUESTED and CRISTAL_FREQ are defined in config.h
*/
#define SPLL_MUL_FACTOR ((SPLL_FREQ_REQUESTED / CRISTAL_FREQ) - 1)
/*
* SPLL Multiplication Factor to get a 20 MHZ running frequency
*/
#define SPLL_MUL_FACTOR_20MHZ ((FREQ_20_MHZ / CRISTAL_FREQ) - 1)
/*
* SPLL Frequency - gives the SPLL real frequency divide by 2
*/
#define SPLL_FREQ ((SPLL_MUL_FACTOR + 1) * CRISTAL_FREQ)
/*
* Baud Rate Generator Clock - gives the Baud Rate Generator Clock (BRGCLK)
* Frequency.
*/
#define BRGCLK_FREQ (SPLL_FREQ / ( 1 << (2 * BRGCLK_DIV_FACTOR)))
/*
* Refresh value - defines the number of BRGCLK period between two
* DRAM refresh cycle.
*/
#define REFRESH_VALUE (BRGCLK_FREQ / DRAM_REFRESH_FREQ)
/*
* Periodic Timer A period - value used to set the PTA bits of
* the Machine A Mode Register (MAMR). This register is used to
* controle the User_Programmable Machine A (UPM). The UPM is part of
* the memory controller.
*/
#define PTA_VALUE (( REFRESH_VALUE / 64) != 0 ? (REFRESH_VALUE / 64) : \
((REFRESH_VALUE / 32) != 0 ? (REFRESH_VALUE / 32) : \
((REFRESH_VALUE / 16) != 0 ? (REFRESH_VALUE / 16) : \
((REFRESH_VALUE / 8) != 0 ? (REFRESH_VALUE / 8) : \
((REFRESH_VALUE / 4) != 0 ? (REFRESH_VALUE / 4) : \
(REFRESH_VALUE / 2))))))
/*
* Periodic Timer Prescaler Division Factor - gives the division factor
* of the Periodic Timer Prescaler (PTP). The PTP is part of the
* memory controller. It divide the BRGCLK (Baud Rate Generator Clock) by
* either 2, 4, 8, 16, 32 or 64 and send this divided clock to the
* Periodic Timer.
* This macro is used to set the DRAM refresh cycle period.
*/
#define PTP_DIV_FACTOR (REFRESH_VALUE / PTA_VALUE)
/*
* PTP Value - translate the Periodic Timer Prescaler Division Factor
* to the value to place in the PTP register.
*/
#define PTP_VALUE ( PTP_DIV_FACTOR == 2 ? MPTPR_PTP_DIV2 : \
(PTP_DIV_FACTOR == 4 ? MPTPR_PTP_DIV4 : \
(PTP_DIV_FACTOR == 8 ? MPTPR_PTP_DIV8 : \
(PTP_DIV_FACTOR == 16 ? MPTPR_PTP_DIV16 : \
(PTP_DIV_FACTOR == 32 ? MPTPR_PTP_DIV32 : \
MPTPR_PTP_DIV64)))))
#define TMBCLK_FREQ CRISTAL_FREQ
/* define the decrementer input clock frequency */
#define DEC_CLOCK_FREQ TMBCLK_FREQ
/* Internal Memory Map base Address */
#define INTERNAL_MEM_MAP_ADDR 0xFF000000
#define INTERNAL_MEM_MAP_SIZE 0x00010000 /* 64 K bytes */
/* CPU type in the PVR */
#define CPU_TYPE_860 0x0050 /* value for PPC860 */
#define CPU_REV_A1_MASK_NUM 0x0010 /* revision mask num */
#endif /* INCconfigh */
--------------------------------------------------------------------------------
编辑 发表於:2002-04-09 - 11:14:42 IP: 10.7.*.*
飞扬
工程师
来自:
发表总数:13
查看 短消息 电子邮件 OICQ 引用 回复
--------------------------------------------------------------------------------
是在syslib.c 里加吗?
里边有这个函数。
STATUS sysFecEnetEnable
(
UINT32 motCpmAddr /* base address of the on-chip RAM */
)
{
int intLevel = intLock();
/* mask IRQ7 off, as it is shared with MII_TX_CLK */
*SIMASK (motCpmAddr) &= ~SIMASK_IRM7;
/* also clear any pending interrupt */
*SIPEND (motCpmAddr) |= SIPEND_IRQ7;
/*
* set the arbitration level for the FEC. Do not enable
* FEC aggressive mode.
*/
*SDCR (motCpmAddr) |= SDCR_FAID_BR6;
/* set Port D to use MII signals */
*PDPAR (motCpmAddr) = 0x1fff;
*PDDIR (motCpmAddr) = 0x1FFF;
intUnlock (intLevel);
return (OK);
}
--------------------------------------------------------------------------------
编辑 发表於:2002-04-09 - 11:20:28 IP: 10.7.*.*
embedfree
高级工程师
来自:
发表总数:142
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
以下文件名是不一定的!!!
使用MPC860BSP,双网口的启动过程
1) 在860PC.h中,通过定义INCLUDE_CPM,做一些10M口的定义,包括名称、BD表、中断等;
#ifdef INCLUDE_CPM /* CPM ethernet driver */
#define INCLUDE_IF_USR
#define IF_USR_NAME `cpm` /* device name */
#define IF_USR_ATTACH sysCpmAttach /* driver attach routine */
/* address of SCC param RAM */
#define IF_USR_ARG1 (char *) INTERNAL_MEM_MAP_ADDR + 0x3c00
#define IF_USR_823ARG1 (char *) INTERNAL_MEM_MAP_ADDR + 0x3d00
/* address of SCC regs */
#define IF_USR_ARG2 (int)INTERNAL_MEM_MAP_ADDR + 0x0a00
#define IF_USR_823ARG2 (int)INTERNAL_MEM_MAP_ADDR + 0x0a20
#define IF_USR_ARG3 (int) IV_SCC1 /* int number for SCC1 */
#define IF_USR_823ARG3 (int) IV_SCC2 /* int number for SCC2 */
/* address of transmit BDs */
#define IF_USR_ARG4 (int) INTERNAL_MEM_MAP_ADDR + 0x2000
/* address of receive BDs */
#define IF_USR_ARG5 (int) INTERNAL_MEM_MAP_ADDR + 0x2100
#define IF_USR_ARG6 (int) 0x20 /* number of transmit BDs */
#define IF_USR_ARG7 (int) 0x20 /* number of receive BDs */
#define IF_USR_ARG8 (int) NONE /* allocate mem for buffers */
#endif /* INCLUDE_CPM */
2) 在CONFIGNET.H中,如果是MPC860,则定义了FADS_860T。同时通过判断是否定义了FADS_860T,来决定DEFAULT_BOOT_LINE的定义是100M口还是10M口。
#ifdef FADS_860T
# define DEFAULT_BOOT_LINE \
`motfec(0,0)host:/usr/wind/target/config/ads860P/vxWorks.st h=192.103.54.45 e=192.103.54.224:ffffff00 u=swamy pw=`
#else /* FADS_860T */
# define DEFAULT_BOOT_LINE \
`cpm(0,0)host:/usr/vw/config/ads860/vxWorks h=90.0.0.3 e=90.0.0.50 u=target`
#endif /* FADS_860T */
3) 在CONFIGNET.H中,通过定义INCLUDE_CPM,ENDDEVTBL[ ]包含调用CPM_LOAD_FUNC==sysMotCpmEndLoad;如果定义了FADS_860T,那么ENDDEVTBL[ ]调用FEC_LOAD_FUNC==motFecEndLoad
#ifdef FADS_860T
END_TBL_ENTRY endDevTbl [] =
{
{ 0, FEC_LOAD_FUNC, FEC_LOAD_STRING, 1, NULL, FALSE},
#ifdef INCLUDE_CPM
{ 1, CPM_LOAD_FUNC, CPM_LOAD_STRING, 1, NULL, FALSE},
#endif /* INCLUDE_CPM */
{ 0, END_TBL_END, NULL, 0, NULL, FALSE},
};
#else /* FADS_860T */
END_TBL_ENTRY endDevTbl [] =
{
{ 0, CPM_LOAD_FUNC, CPM_LOAD_STRING, 1, NULL, FALSE},
{ 0, END_TBL_END, NULL, 0, NULL, FALSE},
};
#endif /* FADS_860T */
4) 在SYSMOTCPMEND.C中,使用sysMotCpmEndLoad装载CPM.
该函数是CPM以太网驱动程序的一部分
* ::::::::
*
同时,在该文件中,定义了netFuncs结构,并通过motCpmEndLoad来调用
LOCAL NET_FUNCS netFuncs =
{
(FUNCPTR)motCpmEndStart, /* start func. */
(FUNCPTR)motCpmEndStop, /* stop func. */
(FUNCPTR)motCpmEndUnload, /* unload func. */
(FUNCPTR)motCpmEndIoctl, /* ioctl func. */
(FUNCPTR)motCpmEndSend, /* send func. */
(FUNCPTR)motCpmEndMCastAddrAdd, /* multicast add func. */
(FUNCPTR)motCpmEndMCastAddrDel, /* multicast delete func. */
(FUNCPTR)motCpmEndMCastAddrGet, /* multicast get fun. */
(FUNCPTR)motCpmEndPollSend, /* polling send func. */
(FUNCPTR)motCpmEndPollReceive, /* polling receive func. */
endEtherAddressForm, /* Put address info into a packet. */
endEtherPacketDataGet, /* Get a pointer to packet data. */
endEtherPacketAddrGet /* Get packet addresses. */
};
if (END_OBJ_INIT (&pDrvCtrl->endObject, (void *)pDrvCtrl, MOT_DEV_NAME,pDrvCtrl->unit,
&netFuncs,END_OBJ_STRING) == ERROR)
return (NULL);
在MOTFECEND.C中,使用motFecEndLoad装载FEC,
该函数是FEC以太网驱动程序的一部分
*
* `:::::
* ::::::`
*
同时,在该文件中,定义了netFuncs结构,并通过motFecEndLoad来调用
LOCAL NET_FUNCS netFuncs =
{
(FUNCPTR) motFecStart, /* start func. */
(FUNCPTR) motFecStop, /* stop func. */
(FUNCPTR) motFecUnload, /* unload func. */
(FUNCPTR) motFecIoctl, /* ioctl func. */
(FUNCPTR) motFecSend, /* send func. */
(FUNCPTR) motFecMCastAddrAdd, /* multicast add func. */
(FUNCPTR) motFecMCastAddrDel, /* multicast delete func. */
(FUNCPTR) motFecMCastAddrGet, /* multicast get fun. */
(FUNCPTR) motFecPollSend, /* polling send func. */
(FUNCPTR) motFecPollReceive, /* polling receive func. */
endEtherAddressForm, /* put address info into a NET_BUFFER */
(FUNCPTR) endEtherPacketDataGet, /* get pointer to data in NET_BUFFER */
(FUNCPTR) endEtherPacketAddrGet /* Get packet addresses */
};
if (END_OBJ_INIT (&pDrvCtrl->endObj, (DEV_OBJ*) pDrvCtrl,
MOT_FEC_DEV_NAME, pDrvCtrl->unit, &netFuncs,
`Motorola FEC Ethernet Enhanced Network Driver`) == ERROR)
goto errorExit;
5) 在USRCONFIG.C中,USRROOT函数调用了usrBootLineInit和usrNetInit函数
ifdef INCLUDE_NET_INIT
usrBootLineInit (sysStartType); /* crack the bootline */
usrNetInit (BOOT_LINE_ADRS); /* initialize network support */
#if CPU==SIMNT
{
extern int simProcnum;
char ulipIP[] = `90.0.0.1`;
ulipIP[7] = `1`+simProcnum;
routeAdd(`0.0.0.0`,ulipIP);
}
#endif /* CPU==SIMNT */
#endif /* INCLUDE_NET_INIT */
6) 在USRNETWORK.C中,usrNetInit调用了muxDevLoad、muxDevStart、
for (count = 0, pDevTbl = endDevTbl; pDevTbl->endLoadFunc != END_TBL_END;pDevTbl++, count++)
{
/* Make sure that WDB has not already installed the device. */
if (!pDevTbl->processed)
{
pCookie = muxDevLoad(pDevTbl->unit,
pDevTbl->endLoadFunc,
pDevTbl->endLoadString,
pDevTbl->endLoan, pDevTbl->pBSP);
if (pCookie == NULL)
{
printf(`muxDevLoad failed for device entry %d!\n`, count);
}
else
{
pDevTbl->processed = TRUE;
if (muxDevStart(pCookie) == ERROR)
{
printf(`muxDevStart failed for device entry %d!\n`, count);
}
}
}
}
7) 在WdbEndPktDrv.C中, wdbEndPktDrv调用 muxBind函数
8) 在USRNETWORK.C中, usrNetIfConfig函数调用了ifAddrSet 和hostAdd函数
/* set inet address */
if (ifAddrSet (ifname, inetAdrs) != OK)
{
printf (`Error setting inet address of %s to %s, errno = %#x\n`,
ifname, inetAdrs, errno);
return (ERROR);
}
/* add host name to host table */
if ((inetName != NULL) && (*inetName != EOS))
hostAdd (inetName, inetAdrs);
return (OK);
9) SOCKET编程
--------------------------------
/***********************/
宠辱不惊,
看庭前花开花落;
去留无意,
任天上云卷云舒
/***********************/
--------------------------------------------------------------------------------
编辑 发表於:2002-04-09 - 12:54:12 IP: 211.99.*.*
飞扬
工程师
来自:
发表总数:13
查看 短消息 电子邮件 OICQ 引用 回复
--------------------------------------------------------------------------------
谢谢回复:)
我的以太网口是不用cpm的,用的是MII,以避免和scc3,4的中断冲突。
#undef INCLUDE_CPM /* exclude the CPM ethernet driver zwb? 02.3.20*/
对了,我只知道ip地址在bootline里有,对目标机的ip设置,只在bootline里设ip够吗?
--------------------------------------------------------------------------------
编辑 发表於:2002-04-09 - 13:27:53 IP: 10.7.*.*
hongwind
高级工程师
来自:
发表总数:101
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
我用过lxt970,应该是一个系列了,对于网口的phy是要进行一些设置的,这些通常是在呢的系统初始化的时候,应该是在呢的ehternet驱动文件中包含了,一旦系统决定安装ethernet,那么对网口就该初始化,而且一定要复位,然后进行。
--------------------------------------------------------------------------------
编辑 发表於:2002-04-09 - 13:45:44 IP: 61.177.*.*
hongwind
高级工程师
来自:
发表总数:101
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
通常的bootline是一个缺省的方式,可以配置网络口的特性,然后在系统load网络设备的时候会对你的bootline进行parse,得到需要参数,配置相应的end_device。
有时可以从你的flash rom中获取,或者从IIC rom,或者就是使用你的缺省的设置,不过你要对读取配置的地方设置位缺省的方式才可以了。
--------------------------------------------------------------------------------
编辑 发表於:2002-04-09 - 13:50:30 IP: 61.177.*.*
embedfree
高级工程师
来自:
发表总数:142
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
FEC和CPM只是一个是MII,一个是SCCx。
不要太绝对了!
IP地址的指定在驱动有效后什么地方都可以,
你可以在BSP中做,也可以在应用程序中做,
MAC地址才是最重要的,需要在BSP中做。
我的文档是两个网口都考虑了,
你是否需要看仔细些呢?
如果你的驱动中没有对MII的支持,
光改头文件有什么用?
--------------------------------
总务科长
--------------------------------------------------------------------------------
好啊,以后多交流!
embedfree 于 2002/04/15 19:01 加贴在 嵌入式系统论坛 设为精华 删除
--------------------------------
--------------------------------------------------------------------------------
我的确还没看仔细。请多包涵。
飞扬 于 2002/04/15 17:55 加贴在 嵌入式系统论坛 设为精华 删除
这两天再看860t的um.我的程序现在能进入中断了。不过进入之后就出现错误。immr->cpmi_civr |= CIVR_IACK;
执行这么一句之后,也就是Set IACK bit in CIVR to request current interrupt vector,civr寄存器就变成0x00.
表示出错了,但是在scce里看不到是什么错误。
对了,我看了一下。我的tornado里没有motfecend.c,但是有motfecend.h,后来我问别人找到motfecend.c发现这才是fec的驱动程序。看来我的tornado不全。我会仔细看embedfree兄的程序。看通了再请教:)
--------------------------------
哈哈,小弟向各位前辈学习了!要教我啊:)
--------------------------------------------------------------------------------
我的确还没看仔细。请多包涵。
飞扬 于 2002/04/15 17:43 加贴在 嵌入式系统论坛 设为精华 删除
关键词: 讨论 ppc860t 串行 调试 中断 冲突 解决
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |