Sorry, this alias seems not allow attachment. I paste
my source file here. I don't if it is the right place
to 
ask these questions. If not, please point me to the 
right alias. Thanks a lot in advance.

sio.c
/*------------------------------------------------------------------------------
SIO.C:  Serial Communication Routines.

Copyright 1995-2002 KEIL Software, Inc.
------------------------------------------------------------------------------*/

#include <reg51.h>
#include <string.h>
#include "sio.h"


xdata volatile unsigned char D5ON _at_ 0xB000;
xdata volatile unsigned char D5OFF _at_ 0xB100;

/*------------------------------------------------------------------------------
Notes:

The length of the receive and transmit buffers must be
a power of 2.

Each buffer has a next_in and a next_out index.

If next_in = next_out, the buffer is empty.

(next_in - next_out) % buffer_size = the number of
characters in the buffer.
------------------------------------------------------------------------------*/
#define TBUF_SIZE   2           /*** Must be one of
these powers of 2 (2,4,8,16,32,64,128) ***/
#define RBUF_SIZE   2 //8           /*** Must be one
of these powers of 2 (2,4,8,16,32,64,128) ***/

#define TBUF_SPACE  idata       /*** Memory space
where the transmit buffer resides ***/
#define RBUF_SPACE  idata       /*** Memory space
where the receive buffer resides ***/

#define CTRL_SPACE  data        /*** Memory space for
the buffer indexes ***/

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
#if TBUF_SIZE < 2
#error TBUF_SIZE is too small.  It must be larger than
1.
#elif TBUF_SIZE > 128
#error TBUF_SIZE is too large.  It must be smaller
than 129.
#elif ((TBUF_SIZE & (TBUF_SIZE-1)) != 0)
#error TBUF_SIZE must be a power of 2.
#endif

#if RBUF_SIZE < 2
#error RBUF_SIZE is too small.  It must be larger than
1.
#elif RBUF_SIZE > 128
#error RBUF_SIZE is too large.  It must be smaller
than 129.
#elif ((RBUF_SIZE & (RBUF_SIZE-1)) != 0)
#error RBUF_SIZE must be a power of 2.
#endif

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
static TBUF_SPACE unsigned char tbuf [TBUF_SIZE];
static RBUF_SPACE unsigned char rbuf [RBUF_SIZE];

static CTRL_SPACE unsigned char t_in = 0;
static CTRL_SPACE unsigned char t_out = 0;

static CTRL_SPACE unsigned char r_in = 0;
static CTRL_SPACE unsigned char r_out = 0;

static bit ti_restart = 0;  /* NZ if TI=1 is required
*/

unsigned char led;

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
static void com_isr (void) interrupt 4
{
/*------------------------------------------------
Received data interrupt.
------------------------------------------------*/
if (RI != 0)
  {
  RI = 0;

  if (((r_in - r_out) & ~(RBUF_SIZE-1)) == 0)
    {
    rbuf [r_in & (RBUF_SIZE-1)] = SBUF;
    r_in++;
    }
  led = D5ON;
  }

/*------------------------------------------------
Transmitted data interrupt.
------------------------------------------------*/
if (TI != 0)
  {
  TI = 0;

  if (t_in != t_out)
    {
    SBUF = tbuf [t_out & (TBUF_SIZE-1)];
    t_out++;
    ti_restart = 0;
    }
  else
    {
    ti_restart = 1;
    }
  }

}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable

void com_initialize (void)
{
/*------------------------------------------------
Setup TIMER1 to generate the proper baud rate.
------------------------------------------------*/
com_baudrate (1200);

/*------------------------------------------------
Clear com buffer indexes.
------------------------------------------------*/
t_in = 0;
t_out = 0;

r_in = 0;
r_out = 0;

/*------------------------------------------------
Setup serial port registers.
------------------------------------------------*/
SM0 = 0; SM1 = 1;   /* serial port MODE 1 */
SM2 = 0;
REN = 1;            /* enable serial receiver */

RI = 0;             /* clear receiver interrupt */
TI = 0;             /* clear transmit interrupt */
ti_restart = 1;

ES = 1;             /* enable serial interrupts */
PS = 0;             /* set serial interrupts to low
priority */
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable

void com_baudrate (
  unsigned baudrate)
{
/*------------------------------------------------
Clear transmit interrupt and buffer.
------------------------------------------------*/
TI = 0;             /* clear transmit interrupt */
t_in = 0;           /* empty transmit buffer */
t_out = 0;

/*------------------------------------------------
Set timer 1 up as a baud rate generator.
------------------------------------------------*/
TR1 = 0;            /* stop timer 1 */
ET1 = 0;            /* disable timer 1 interrupt */

PCON |= 0x80;       /* 0x80=SMOD: set serial baudrate
doubler */

TMOD &= ~0xF0;      /* clear timer 1 mode bits */
TMOD |= 0x20;       /* put timer 1 into MODE 2 */

TH1 = (unsigned char) (256 - (XTAL / (16L * 12L *
baudrate)));

TR1 = 1;            /* start timer 1 */
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable

char com_putchar (
  unsigned char c)
{
/*------------------------------------------------
If the buffer is full, return an error value.
------------------------------------------------*/
if (com_tbuflen () >= TBUF_SIZE)
  return (-1);

/*------------------------------------------------
Add the data to the transmit buffer.  If the
transmit interrupt is disabled, then enable it.
------------------------------------------------*/
tbuf [t_in & (TBUF_SIZE - 1)] = c;
t_in++;

if (ti_restart)
  {
  ti_restart = 0;
  TI = 1;               /* generate transmit interrupt
*/
  }

return (0);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable

int com_getchar (void)
{
if (com_rbuflen () == 0)
  return (-1);

return (rbuf [(r_out++) & (RBUF_SIZE - 1)]);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable

unsigned char com_rbuflen (void)
{
return (r_in - r_out);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable

unsigned char com_tbuflen (void)
{
return (t_in - t_out);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/



main.c

/*------------------------------------------------------------------------------
MAIN.C:  Interrupt Driver SIO Using printf.

Copyright 1995-2002 KEIL Software, Inc.
------------------------------------------------------------------------------*/

#include <reg51.h>
#include <stdio.h>
#include "sio.h"

/*XTAL=11059200*/
/*------------------------------------------------------------------------------
_getkey waits until a character is received from the
serial port.  This may not
be the exact desired operation (for example if the
buffer is empty, this
function hangs waiting for a character to be
received).
------------------------------------------------------------------------------*/
char _getkey (void)
{
int k;

do
  {
  k = com_getchar ();
  }
while (k == -1);

return ((unsigned char) k);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
char putchar (char c)
{
volatile unsigned int i;

while (com_putchar (c) != 0)
  {
  for (i=0; i<1000; i++)
    {
    /*** DO NOTHING ***/
    }
  }

return (c);
}

/*------------------------------------------------------------------------------
Note that the two function above, _getkey and putchar,
replace the library
functions of the same name.  These functions use the
interrupt-driven serial
I/O routines in SIO.C.
------------------------------------------------------------------------------*/
code char message [] =
  "This is a test to see if the interrupt driven
serial I/O routines really work.";

void main (void)
{
com_initialize ();              /* initialize
interrupt driven serial I/O */
com_baudrate (1200);            /* setup for 1200 baud
*/

EA = 1;                         /* Enable Interrupts
*/

printf ("Interrupt-driven Serial I/O
Example\r\n\r\n");

while (1)
  {
  unsigned char c;

  printf ("You have pressed a key.\r\n");
  c = getchar ();
  printf ("\r\n");
  printf ("You pressed '%c'.\r\n\r\n", c);
  }
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/


 --- lei chen <[EMAIL PROTECTED]> :
> Hi,
>  I am using FX2 CY3681 to develop a USB device like
> usb-serial adaptor.  I want to use the serial port 0
> on CY3681 to send and receive data.
> That is:
>  Host1--->  EZ-USB FX2  --->  Test system( Solaris)
>       RS232             USB
> 


_________________________________________________________
Do You Yahoo!?
注册世界一流品质的雅虎免费电邮
http://cn.rd.yahoo.com/mail_cn/tag/1g/*http://cn.mail.yahoo.com/


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to