linux-headers (unknown)

(root)/
include/
linux/
map_to_14segment.h
       1  /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
       2  /*
       3   * Copyright (C) 2021 Glider bv
       4   *
       5   * Based on include/uapi/linux/map_to_7segment.h:
       6  
       7   * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
       8   */
       9  
      10  #ifndef MAP_TO_14SEGMENT_H
      11  #define MAP_TO_14SEGMENT_H
      12  
      13  /* This file provides translation primitives and tables for the conversion
      14   * of (ASCII) characters to a 14-segments notation.
      15   *
      16   * The 14 segment's wikipedia notation below is used as standard.
      17   * See: https://en.wikipedia.org/wiki/Fourteen-segment_display
      18   *
      19   * Notation:	+---a---+
      20   *		|\  |  /|
      21   *		f h i j b
      22   *		|  \|/  |
      23   *		+-g1+-g2+
      24   *		|  /|\  |
      25   *		e k l m c
      26   *		|/  |  \|
      27   *		+---d---+
      28   *
      29   * Usage:
      30   *
      31   *   Register a map variable, and fill it with a character set:
      32   *	static SEG14_DEFAULT_MAP(map_seg14);
      33   *
      34   *
      35   *   Then use for conversion:
      36   *	seg14 = map_to_seg14(&map_seg14, some_char);
      37   *	...
      38   *
      39   * In device drivers it is recommended, if required, to make the char map
      40   * accessible via the sysfs interface using the following scheme:
      41   *
      42   * static ssize_t map_seg14_show(struct device *dev,
      43   *				 struct device_attribute *attr, char *buf)
      44   * {
      45   *	memcpy(buf, &map_seg14, sizeof(map_seg14));
      46   *	return sizeof(map_seg14);
      47   * }
      48   * static ssize_t map_seg14_store(struct device *dev,
      49   *				  struct device_attribute *attr,
      50   *				  const char *buf, size_t cnt)
      51   * {
      52   *	if (cnt != sizeof(map_seg14))
      53   *		return -EINVAL;
      54   *	memcpy(&map_seg14, buf, cnt);
      55   *	return cnt;
      56   * }
      57   * static DEVICE_ATTR_RW(map_seg14);
      58   */
      59  #include <linux/errno.h>
      60  #include <linux/types.h>
      61  
      62  #include <asm/byteorder.h>
      63  
      64  #define BIT_SEG14_A		0
      65  #define BIT_SEG14_B		1
      66  #define BIT_SEG14_C		2
      67  #define BIT_SEG14_D		3
      68  #define BIT_SEG14_E		4
      69  #define BIT_SEG14_F		5
      70  #define BIT_SEG14_G1		6
      71  #define BIT_SEG14_G2		7
      72  #define BIT_SEG14_H		8
      73  #define BIT_SEG14_I		9
      74  #define BIT_SEG14_J		10
      75  #define BIT_SEG14_K		11
      76  #define BIT_SEG14_L		12
      77  #define BIT_SEG14_M		13
      78  #define BIT_SEG14_RESERVED1	14
      79  #define BIT_SEG14_RESERVED2	15
      80  
      81  struct seg14_conversion_map {
      82  	__be16 table[128];
      83  };
      84  
      85  static __inline__ int map_to_seg14(struct seg14_conversion_map *map, int c)
      86  {
      87  	if (c < 0 || c >= sizeof(map->table) / sizeof(map->table[0]))
      88  		return -EINVAL;
      89  
      90  	return __be16_to_cpu(map->table[c]);
      91  }
      92  
      93  #define SEG14_CONVERSION_MAP(_name, _map)	\
      94  	struct seg14_conversion_map _name = { .table = { _map } }
      95  
      96  /*
      97   * It is recommended to use a facility that allows user space to redefine
      98   * custom character sets for LCD devices. Please use a sysfs interface
      99   * as described above.
     100   */
     101  #define MAP_TO_SEG14_SYSFS_FILE	"map_seg14"
     102  
     103  /*******************************************************************************
     104   * ASCII conversion table
     105   ******************************************************************************/
     106  
     107  #define _SEG14(sym, a, b, c, d, e, f, g1, g2, h, j, k, l, m, n)	\
     108  	__cpu_to_be16( a << BIT_SEG14_A  |  b << BIT_SEG14_B  |	\
     109  		       c << BIT_SEG14_C  |  d << BIT_SEG14_D  |	\
     110  		       e << BIT_SEG14_E  |  f << BIT_SEG14_F  |	\
     111  		      g1 << BIT_SEG14_G1 | g2 << BIT_SEG14_G2 |	\
     112  		       h << BIT_SEG14_H  |  j << BIT_SEG14_I  |	\
     113  		       k << BIT_SEG14_J  |  l << BIT_SEG14_K  |	\
     114  		       m << BIT_SEG14_L  |  n << BIT_SEG14_M )
     115  
     116  #define _MAP_0_32_ASCII_SEG14_NON_PRINTABLE				\
     117  	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     118  
     119  #define _MAP_33_47_ASCII_SEG14_SYMBOL				\
     120  	_SEG14('!', 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),	\
     121  	_SEG14('"', 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),	\
     122  	_SEG14('#', 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0),	\
     123  	_SEG14('$', 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0),	\
     124  	_SEG14('%', 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0),	\
     125  	_SEG14('&', 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1),	\
     126  	_SEG14('\'',0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),	\
     127  	_SEG14('(', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1),	\
     128  	_SEG14(')', 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0),	\
     129  	_SEG14('*', 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1),	\
     130  	_SEG14('+', 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0),	\
     131  	_SEG14(',', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),	\
     132  	_SEG14('-', 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0),	\
     133  	_SEG14('.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),	\
     134  	_SEG14('/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0),
     135  
     136  #define _MAP_48_57_ASCII_SEG14_NUMERIC				\
     137  	_SEG14('0', 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0),	\
     138  	_SEG14('1', 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),	\
     139  	_SEG14('2', 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0),	\
     140  	_SEG14('3', 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0),	\
     141  	_SEG14('4', 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     142  	_SEG14('5', 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1),	\
     143  	_SEG14('6', 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     144  	_SEG14('7', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0),	\
     145  	_SEG14('8', 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     146  	_SEG14('9', 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0),
     147  
     148  #define _MAP_58_64_ASCII_SEG14_SYMBOL				\
     149  	_SEG14(':', 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0),	\
     150  	_SEG14(';', 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0),	\
     151  	_SEG14('<', 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1),	\
     152  	_SEG14('=', 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0),	\
     153  	_SEG14('>', 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0),	\
     154  	_SEG14('?', 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0),	\
     155  	_SEG14('@', 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0),
     156  
     157  #define _MAP_65_90_ASCII_SEG14_ALPHA_UPPER			\
     158  	_SEG14('A', 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     159  	_SEG14('B', 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0),	\
     160  	_SEG14('C', 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),	\
     161  	_SEG14('D', 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0),	\
     162  	_SEG14('E', 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0),	\
     163  	_SEG14('F', 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0),	\
     164  	_SEG14('G', 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0),	\
     165  	_SEG14('H', 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     166  	_SEG14('I', 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0),	\
     167  	_SEG14('J', 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),	\
     168  	_SEG14('K', 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1),	\
     169  	_SEG14('L', 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),	\
     170  	_SEG14('M', 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0),	\
     171  	_SEG14('N', 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1),	\
     172  	_SEG14('O', 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),	\
     173  	_SEG14('P', 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     174  	_SEG14('Q', 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1),	\
     175  	_SEG14('R', 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1),	\
     176  	_SEG14('S', 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0),	\
     177  	_SEG14('T', 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0),	\
     178  	_SEG14('U', 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),	\
     179  	_SEG14('V', 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0),	\
     180  	_SEG14('W', 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1),	\
     181  	_SEG14('X', 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1),	\
     182  	_SEG14('Y', 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0),	\
     183  	_SEG14('Z', 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0),
     184  
     185  #define _MAP_91_96_ASCII_SEG14_SYMBOL				\
     186  	_SEG14('[', 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),	\
     187  	_SEG14('\\',0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),	\
     188  	_SEG14(']', 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),	\
     189  	_SEG14('^', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1),	\
     190  	_SEG14('_', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),	\
     191  	_SEG14('`', 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
     192  
     193  #define _MAP_97_122_ASCII_SEG14_ALPHA_LOWER			\
     194  	_SEG14('a', 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0),	\
     195  	_SEG14('b', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1),	\
     196  	_SEG14('c', 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0),	\
     197  	_SEG14('d', 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0),	\
     198  	_SEG14('e', 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0),	\
     199  	_SEG14('f', 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0),	\
     200  	_SEG14('g', 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0),	\
     201  	_SEG14('h', 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0),	\
     202  	_SEG14('i', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),	\
     203  	_SEG14('j', 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0),	\
     204  	_SEG14('k', 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1),	\
     205  	_SEG14('l', 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),	\
     206  	_SEG14('m', 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0),	\
     207  	_SEG14('n', 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0),	\
     208  	_SEG14('o', 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0),	\
     209  	_SEG14('p', 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0),	\
     210  	_SEG14('q', 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0),	\
     211  	_SEG14('r', 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0),	\
     212  	_SEG14('s', 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1),	\
     213  	_SEG14('t', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0),	\
     214  	_SEG14('u', 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),	\
     215  	_SEG14('v', 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0),	\
     216  	_SEG14('w', 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1),	\
     217  	_SEG14('x', 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1),	\
     218  	_SEG14('y', 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0),	\
     219  	_SEG14('z', 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0),
     220  
     221  #define _MAP_123_126_ASCII_SEG14_SYMBOL				\
     222  	_SEG14('{', 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0),	\
     223  	_SEG14('|', 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0),	\
     224  	_SEG14('}', 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1),	\
     225  	_SEG14('~', 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0),
     226  
     227  /* Maps */
     228  #define MAP_ASCII14SEG_ALPHANUM			\
     229  	_MAP_0_32_ASCII_SEG14_NON_PRINTABLE	\
     230  	_MAP_33_47_ASCII_SEG14_SYMBOL		\
     231  	_MAP_48_57_ASCII_SEG14_NUMERIC		\
     232  	_MAP_58_64_ASCII_SEG14_SYMBOL		\
     233  	_MAP_65_90_ASCII_SEG14_ALPHA_UPPER	\
     234  	_MAP_91_96_ASCII_SEG14_SYMBOL		\
     235  	_MAP_97_122_ASCII_SEG14_ALPHA_LOWER	\
     236  	_MAP_123_126_ASCII_SEG14_SYMBOL
     237  
     238  #define SEG14_DEFAULT_MAP(_name)		\
     239  	SEG14_CONVERSION_MAP(_name, MAP_ASCII14SEG_ALPHANUM)
     240  
     241  #endif	/* MAP_TO_14SEGMENT_H */