xref: /OK3568_Linux_fs/u-boot/include/hexdump.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2018 Synopsys, Inc. All rights reserved.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef HEXDUMP_H
8*4882a593Smuzhiyun #define HEXDUMP_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/ctype.h>
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun enum {
14*4882a593Smuzhiyun 	DUMP_PREFIX_NONE,
15*4882a593Smuzhiyun 	DUMP_PREFIX_ADDRESS,
16*4882a593Smuzhiyun 	DUMP_PREFIX_OFFSET
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun extern const char hex_asc[];
20*4882a593Smuzhiyun #define hex_asc_lo(x)	hex_asc[((x) & 0x0f)]
21*4882a593Smuzhiyun #define hex_asc_hi(x)	hex_asc[((x) & 0xf0) >> 4]
22*4882a593Smuzhiyun 
hex_byte_pack(char * buf,u8 byte)23*4882a593Smuzhiyun static inline char *hex_byte_pack(char *buf, u8 byte)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	*buf++ = hex_asc_hi(byte);
26*4882a593Smuzhiyun 	*buf++ = hex_asc_lo(byte);
27*4882a593Smuzhiyun 	return buf;
28*4882a593Smuzhiyun }
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /**
31*4882a593Smuzhiyun  * hex_to_bin - convert a hex digit to its real value
32*4882a593Smuzhiyun  * @ch: ascii character represents hex digit
33*4882a593Smuzhiyun  *
34*4882a593Smuzhiyun  * hex_to_bin() converts one hex digit to its actual value or -1 in case of bad
35*4882a593Smuzhiyun  * input.
36*4882a593Smuzhiyun  */
hex_to_bin(char ch)37*4882a593Smuzhiyun static inline int hex_to_bin(char ch)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	if ((ch >= '0') && (ch <= '9'))
40*4882a593Smuzhiyun 		return ch - '0';
41*4882a593Smuzhiyun 	ch = tolower(ch);
42*4882a593Smuzhiyun 	if ((ch >= 'a') && (ch <= 'f'))
43*4882a593Smuzhiyun 		return ch - 'a' + 10;
44*4882a593Smuzhiyun 	return -1;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /**
48*4882a593Smuzhiyun  * hex2bin - convert an ascii hexadecimal string to its binary representation
49*4882a593Smuzhiyun  * @dst: binary result
50*4882a593Smuzhiyun  * @src: ascii hexadecimal string
51*4882a593Smuzhiyun  * @count: result length
52*4882a593Smuzhiyun  *
53*4882a593Smuzhiyun  * Return 0 on success, -1 in case of bad input.
54*4882a593Smuzhiyun  */
hex2bin(u8 * dst,const char * src,size_t count)55*4882a593Smuzhiyun static inline int hex2bin(u8 *dst, const char *src, size_t count)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	while (count--) {
58*4882a593Smuzhiyun 		int hi = hex_to_bin(*src++);
59*4882a593Smuzhiyun 		int lo = hex_to_bin(*src++);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 		if ((hi < 0) || (lo < 0))
62*4882a593Smuzhiyun 			return -1;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 		*dst++ = (hi << 4) | lo;
65*4882a593Smuzhiyun 	}
66*4882a593Smuzhiyun 	return 0;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /**
70*4882a593Smuzhiyun  * bin2hex - convert binary data to an ascii hexadecimal string
71*4882a593Smuzhiyun  * @dst: ascii hexadecimal result
72*4882a593Smuzhiyun  * @src: binary data
73*4882a593Smuzhiyun  * @count: binary data length
74*4882a593Smuzhiyun  */
bin2hex(char * dst,const void * src,size_t count)75*4882a593Smuzhiyun static inline char *bin2hex(char *dst, const void *src, size_t count)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	const unsigned char *_src = src;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	while (count--)
80*4882a593Smuzhiyun 		dst = hex_byte_pack(dst, *_src++);
81*4882a593Smuzhiyun 	return dst;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize,
85*4882a593Smuzhiyun 		       char *linebuf, size_t linebuflen, bool ascii);
86*4882a593Smuzhiyun void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize,
87*4882a593Smuzhiyun 		    int groupsize, const void *buf, size_t len, bool ascii);
88*4882a593Smuzhiyun void print_hex_dump_bytes(const char *prefix_str, int prefix_type,
89*4882a593Smuzhiyun 			  const void *buf, size_t len);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #endif /* HEXDUMP_H */
92