⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmodem.c.svn-base

📁 本驱动是 s3c2410 声卡驱动,实现了 mp3,wav格式的音频文件的播放 
💻 SVN-BASE
字号:
#include "config.h"
#include "lib.h"

#define XMODEM_SOH 0x01
#define XMODEM_EOT 0x04
#define XMODEM_ACK 0x06
#define XMODEM_NAK 0x15
#define XMODEM_CAN 0x18
#define XMODEM_DATA_SIZE 128

struct frame
{
  char   blknum;
  char   blknumcompl;
  char   data[XMODEM_DATA_SIZE];
  char   cksum;
};

static char
cksum(struct frame *f)
{
  int i;
  int sum = 0;
  for(i = 0; i < XMODEM_DATA_SIZE; i++) {
    sum += f->data[i];		
  }
  return (sum & 0xff);	
}

static void 
get_frame(struct frame *rframe)
{	
  int i;
  rframe->blknum = sio_getc();
  rframe->blknumcompl = sio_getc();
  for(i=0; i < XMODEM_DATA_SIZE; i++) {
      rframe->data[i] = sio_getc();
    }
  rframe->cksum = sio_getc();
}	

int
xmodem(char *p)
{
  struct frame aframe;
  int i, len = 0;
  
  do {
		int loop = 900000; /*XXX*/
    sio_putc(XMODEM_NAK);
    
 		while(--loop && (!sio_ischar()))
			;
			
		if(loop)
			break;
			
  } while(1);
      
  while(1) {	
      switch(sio_getc()) {	
      case XMODEM_SOH:
				get_frame(&aframe);

				if((aframe.blknumcompl == 255 - aframe.blknum) && 
				   (cksum(&aframe) == aframe.cksum)) {
				    len += XMODEM_DATA_SIZE;
	    
				    for(i = 0; i < XMODEM_DATA_SIZE; i++)
				      *p++ = aframe.data[i];

				    sio_putc(XMODEM_ACK);
				} else {
				    sio_putc(XMODEM_NAK);
				}
				break;
				
      case XMODEM_EOT:
				sio_putc(XMODEM_ACK);
				return len;
	
      case XMODEM_CAN:
				return -1;				
      }  
  }	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -