srecord.c
来自「gpsd, a popular GPS daemon.」· C语言 代码 · 共 137 行
C
137 行
/* $Id: srecord.c 3666 2006-10-26 23:11:51Z ckuethe $ *//* * Copyright (c) 2005 Chris Kuethe <chris.kuethe@gmail.com> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */#include <sys/types.h>#include <stdio.h>#include <string.h>#include "gpsd_config.h"#include "gpsd.h"/* * See srec(5) for a description of this format. * We read and write 4-byte addresses. * S0: Comments * S3: Memory Loadable Data, 4byte address * S5: Count of S1, S2 and S3 Records * S7: starting execution address interpreted as a 4-byte address */#define MAX_BYTES_PER_RECORD 16/* * bin2srec: turn a chunk of binary into an S-record * offset: used to specify load address * num: up to MAX_BYTES_PER_RECORD bytes can be encoded at one time * bytes are read from bbuf and a ready-to-go srecord is placed in sbuf */intbin2srec(unsigned int type, unsigned int offset, unsigned int num, unsigned char *bbuf, unsigned char *sbuf){ unsigned char abuf[MAX_BYTES_PER_RECORD*2 + 2], sum; size_t len; if ((num < 1) || (num > MAX_BYTES_PER_RECORD)) return -1; len = (size_t)(4 + num + 1); memset(abuf, 0, sizeof(abuf)); hexdump((size_t)num, bbuf, abuf); sum = sr_sum((unsigned int)len, offset, bbuf); (void)snprintf((char *)sbuf, MAX_BYTES_PER_RECORD*2 + 17, "S%u%02X%08X%s%02X\r\n", type, (unsigned)len, offset, (char *)abuf, (unsigned)sum); return 0;}intsrec_hdr(unsigned int num, unsigned char *bbuf, unsigned char *sbuf){ return bin2srec(0, 0, num, bbuf, sbuf);}intsrec_fin(unsigned int num, unsigned char *sbuf){ unsigned char bbuf[4], sum; memset(bbuf, 0, 4); bbuf[0] = (unsigned char)(num & 0xff); bbuf[1] = (unsigned char)((num >> 8) & 0xff); sum = sr_sum(3, 0, bbuf); (void)snprintf((char *)sbuf, 13, "S503%04X%02X\r\n", num, (unsigned)sum); return 0;}voidhexdump(size_t len, unsigned char *bbuf, unsigned char *abuf){ size_t i; memset(abuf, 0, MAX_BYTES_PER_RECORD*2 + 2); if (len > MAX_BYTES_PER_RECORD*2) len = MAX_BYTES_PER_RECORD*2; for(i = 0; i < len; i++){ abuf[i*2] = hc((bbuf[i] &0xf0) >> 4); abuf[i*2+1] = hc(bbuf[i] &0x0f); }}/*@ -type @*/unsigned charhc(unsigned char x){ switch(x){ case 15: case 14: case 13: case 12: case 11: case 10: return ('A' + x - 10); case 9: case 8: case 7: case 6: case 5: case 4: case 3: case 2: case 1: case 0: return ('0' + x); default: return '0'; }}/*@ -type @*/unsigned charsr_sum(unsigned int count, unsigned int addr, unsigned char *bbuf){ int i, j; unsigned char k, sum = 0; sum = (count & 0xff); sum += ((addr & 0x000000ff)); sum += ((addr & 0x0000ff00) >> 8); sum += ((addr & 0x00ff0000) >> 16); sum += ((addr & 0xff000000) >> 24); j = count - 5; for(i = 0; i < j; i++){ k = bbuf[i]; sum += k; } return ~sum;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?