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