printk.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //
  2. // Created by longjin on 2022/1/21.
  3. //
  4. #pragma once
  5. #define PAD_ZERO 1 // 0填充
  6. #define LEFT 2 // 靠左对齐
  7. #define RIGHT 4 // 靠右对齐
  8. #define PLUS 8 // 在正数前面显示加号
  9. #define SPACE 16
  10. #define SPECIAL 32 // 在八进制数前面显示 '0o',在十六进制数前面显示 '0x' 或 '0X'
  11. #define SMALL 64 // 十进制以上数字显示小写字母
  12. #define SIGN 128 // 显示符号位
  13. #define is_digit(c) ((c) >= '0' && (c) <= '9') // 用来判断是否是数字的宏
  14. // 字体颜色的宏定义
  15. #define WHITE 0x00ffffff //白
  16. #define BLACK 0x00000000 //黑
  17. #define RED 0x00ff0000 //红
  18. #define ORANGE 0x00ff8000 //橙
  19. #define YELLOW 0x00ffff00 //黄
  20. #define GREEN 0x0000ff00 //绿
  21. #define BLUE 0x000000ff //蓝
  22. #define INDIGO 0x0000ffff //靛
  23. #define PURPLE 0x008000ff //紫
  24. // 异常的宏定义
  25. #define EPOS_OVERFLOW 1 // 坐标溢出
  26. #define EFB_MISMATCH 2 // 帧缓冲区与指定的屏幕大小不匹配
  27. #include "font.h"
  28. #include "glib.h"
  29. //#include "linkage.h"
  30. #include <stdarg.h>
  31. struct screen_info
  32. {
  33. int width, height; //屏幕大小
  34. int max_x, max_y; // 最大x、y字符数
  35. int x, y; //光标位置
  36. int char_size_x, char_size_y;
  37. unsigned int *FB_address; //帧缓冲区首地址
  38. unsigned long FB_length; // 帧缓冲区长度
  39. };
  40. extern unsigned char font_ascii[256][16]; //导出ascii字体的bitmap(8*16大小) ps:位于font.h中
  41. char buf[4096]; //vsprintf()的缓冲区
  42. /**
  43. * @brief 初始化printk的屏幕信息
  44. *
  45. * @param width 屏幕宽度
  46. * @param height 屏幕高度
  47. * @param FB_address 帧缓冲区地址
  48. * @param FB_length 帧缓冲区长度
  49. * @param char_size_x 字符的列坐标
  50. * @param char_size_y 字符的行坐标
  51. */
  52. int init_printk(const int width, const int height, unsigned int *FB_address, const int FB_length, const int char_size_x, const int char_size_y);
  53. /**
  54. * @brief Set the printk pos object
  55. *
  56. * @param x 列坐标
  57. * @param y 行坐标
  58. */
  59. int set_printk_pos(const int x, const int y);
  60. /**
  61. * @brief 将字符串按照fmt和args中的内容进行格式化,然后保存到buf中
  62. *
  63. * @param buf 结果缓冲区
  64. * @param fmt 格式化字符串
  65. * @param args 内容
  66. * @return 最终字符串的长度
  67. */
  68. static int vsprintf(char *buf, const char *fmt, va_list args);
  69. /**
  70. * @brief 将数字按照指定的要求转换成对应的字符串(2~36进制)
  71. *
  72. * @param str 要返回的字符串
  73. * @param num 要打印的数值
  74. * @param base 基数
  75. * @param field_width 区域宽度
  76. * @param precision 精度
  77. * @param flags 标志位
  78. */
  79. static char* write_num(char *str, ull num, int base, int field_width, int precision, int flags);
  80. static char *write_float_point_num(char *str, double num, int field_width, int precision, int flags);
  81. /**
  82. * @brief 在屏幕上指定位置打印字符
  83. *
  84. * @param fb 帧缓存线性地址
  85. * @param Xsize 行分辨率
  86. * @param x 左上角列像素点位置
  87. * @param y 左上角行像素点位置
  88. * @param FRcolor 字体颜色
  89. * @param BKcolor 背景颜色
  90. * @param font 字符的bitmap
  91. */
  92. static void putchar(unsigned int *fb, int Xsize, int x, int y, unsigned int FRcolor, unsigned int BKcolor, unsigned char font);
  93. /**
  94. * @brief 格式化打印字符串
  95. *
  96. * @param FRcolor 前景色
  97. * @param BKcolor 背景色
  98. * @param ... 格式化字符串
  99. */
  100. #define printk(...) printk_color( WHITE, BLACK, __VA_ARGS__ )
  101. int printk_color(unsigned int FRcolor, unsigned int BKcolor, const char*fmt, ...);