source: rtems/c/src/lib/libbsp/arm/nds/tools/ndstool/include/crc.h @ adada0d

4.104.115
Last change on this file since adada0d was 311dfa6, checked in by Joel Sherrill <joel.sherrill@…>, on 04/16/08 at 18:37:33

2008-04-16 Matthieu Bucchianeri <mbucchia@…>

  • ChangeLog?, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files.
  • Property mode set to 100644
File size: 4.8 KB
Line 
1/*
2        Cyclic Redundancy Code (CRC) functions
3        by Rafael Vuijk (aka DarkFader)
4*/
5
6#ifndef __CRC_H
7#define __CRC_H
8
9//#include "little.h"           // FixCrc is not yet big endian compatible
10
11/*
12 * Data
13 */
14extern unsigned short ccitt16tab[];
15extern unsigned short crc16tab[];
16extern unsigned long crc32tab[];
17
18/*
19 * Defines
20 */
21#define CRC_TEMPLATE    template <typename CrcType, CrcType *crcTable>
22
23/*
24 * CalcCcitt
25 * Does not perform final inversion.
26 */
27#define CalcCcitt_      CalcCcitt<CrcType, crcTable>
28#define CalcCcitt16     CalcCcitt<typeof(*ccitt16tab), ccitt16tab>
29CRC_TEMPLATE inline CrcType CalcCcitt(unsigned char *data, unsigned int length, CrcType crc = (CrcType)0)
30{
31        for (unsigned int i=0; i<length; i++)
32        {
33                crc = (crc << 8) ^ crcTable[(crc >> 8) ^ data[i]];
34        }
35        return crc;
36}
37
38/*
39 * CalcCrc
40 * Does not perform final inversion.
41 */
42#define CalcCrc_        CalcCrc<CrcType, crcTable>
43#define CalcCrc16       CalcCrc<typeof(*crc16tab), crc16tab>
44#define CalcCrc32       CalcCrc<typeof(*crc32tab), crc32tab>
45CRC_TEMPLATE inline CrcType CalcCrc(unsigned char *data, unsigned int length, CrcType crc = (CrcType)~0)
46{
47        for (unsigned int i=0; i<length; i++)
48        {
49                crc = (crc >> 8) ^ crcTable[(crc ^ data[i]) & 0xFF];
50        }
51        return crc;
52}
53
54/*
55 * FCalcCrc
56 * Does not perform final inversion.
57 */
58#define FCalcCrc_       FCalcCrc<CrcType, crcTable>
59#define FCalcCrc16      FCalcCrc<typeof(*crc16tab), crc16tab>
60#define FCalcCrc32      FCalcCrc<typeof(*crc32tab), crc32tab>
61CRC_TEMPLATE inline CrcType FCalcCrc(FILE *f, unsigned int offset, unsigned int length, CrcType crc = (CrcType)~0)
62{
63        fseek(f, offset, SEEK_SET);
64        for (unsigned int i=0; i<length; i++)
65        {
66                crc = (crc >> 8) ^ crcTable[(crc ^ fgetc(f)) & 0xFF];
67        }
68        return crc;
69}
70
71/*
72 * RevCrc
73 * Reverse table lookup.
74 */
75#define RevCrc_         RevCrc<CrcType, crcTable>
76CRC_TEMPLATE inline unsigned char RevCrc(unsigned char x, CrcType *value = 0)
77{
78        for (int y=0; y<256; y++)
79        {
80                if ((crcTable[y] >> (8*sizeof(CrcType)-8)) == x)
81                {
82                        if (value) *value = crcTable[y];
83                        return y;
84                }
85        }
86        return 0;
87}
88
89/*
90 * FixCrc
91 */
92#define FixCrc_         FixCrc<CrcType, crcTable>
93#define FixCrc16        FixCrc<typeof(*crc16tab), crc16tab>
94#define FixCrc32        FixCrc<typeof(*crc32tab), crc32tab>
95CRC_TEMPLATE void FixCrc
96(
97        unsigned char *data,                            // data to be patched
98        unsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length,        // patch data
99        unsigned int fix_offset = 0,            // position to write the fix. by default, it is immediately after the patched data
100        CrcType initial_crc = (CrcType)~0       // useful when manually calculating leading data
101)
102{
103        if (!fix_offset) fix_offset = patch_offset + patch_length;
104
105        // calculate CRC after leading data
106        initial_crc = CalcCrc_(data, patch_offset, initial_crc);
107
108        // calculate CRC before fix
109        unsigned char buf[2*sizeof(CrcType)];
110        CrcType crc_before_fix = CalcCrc_(data + patch_offset, fix_offset - patch_offset);
111        *(CrcType *)(buf + 0) = crc_before_fix;
112
113        // patch
114        memcpy(data + patch_offset, patch_data, patch_length);
115
116        // calculate CRC after unfixed
117        CrcType crc_after_unfix = CalcCrc_(data + patch_offset, fix_offset - patch_offset + sizeof(CrcType));
118        *(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix;
119
120        // fix it
121        for (int i=sizeof(CrcType); i>=1; i--)
122        {
123                CrcType value;
124                unsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value);
125                *(CrcType *)(buf + i) ^= value;
126                buf[i - 1] ^= index;
127        }
128        memcpy(data + fix_offset, buf, sizeof(CrcType));
129}
130
131/*
132 * FFixCrc
133 */
134#define FFixCrc_        FFixCrc<CrcType, crcTable>
135#define FFixCrc16       FFixCrc<typeof(*crc16tab), crc16tab>
136#define FFixCrc32       FFixCrc<typeof(*crc32tab), crc32tab>
137CRC_TEMPLATE void FFixCrc
138(
139        FILE *f,                                                        // file to be patched
140        unsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length,        // patch data
141        unsigned int fix_offset = 0,            // position to write the fix. by default, it is immediately after the patched data
142        CrcType initial_crc = (CrcType)~0       // useful when manually calculating leading data
143)
144{
145        if (!fix_offset) fix_offset = patch_offset + patch_length;
146
147        // calculate CRC after leading data
148        initial_crc = FCalcCrc_(f, 0, patch_offset, initial_crc);
149
150        // calculate CRC before fix
151        unsigned char buf[2*sizeof(CrcType)];
152        CrcType crc_before_fix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset);
153        *(CrcType *)(buf + 0) = crc_before_fix;
154
155        // patch
156        fseek(f, patch_offset, SEEK_SET);
157        fwrite(patch_data, 1, patch_length, f);
158
159        // calculate CRC after unfixed
160        CrcType crc_after_unfix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset + sizeof(CrcType));
161        *(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix;
162
163        // fix it
164        for (int i=sizeof(CrcType); i>=1; i--)
165        {
166                CrcType value;
167                unsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value);
168                *(CrcType *)(buf + i) ^= value;
169                buf[i - 1] ^= index;
170        }
171        fseek(f, fix_offset, SEEK_SET);
172        fwrite(buf, sizeof(CrcType), 1, f);
173}
174
175#endif  // __CRC_H
Note: See TracBrowser for help on using the repository browser.