GadgetSeed  0.9.6
tkprintf.c
[詳解]
1 /** @file
2  @brief カーネル用機能限定printf
3 
4  @date 2017.08.28
5  @author Takashi SHUDO
6 */
7 
8 #include "vtprintf.h"
9 #include "tkprintf.h"
10 
11 static struct st_device *kmess_dev;
12 static io_write kmess_out;
13 
14 static unsigned char *kmess_sp;
15 static unsigned int kmess_size, kmess_count;
16 
17 static int ksputs(unsigned char *str, unsigned int len)
18 {
19  unsigned int i;
20  int count = 0;
21 
22  for(i=0; i<len; i++) {
23  if(kmess_count >= kmess_size) {
24  *(kmess_sp - 1) = '!'; // バッファ終端にたどり着いた
25  break;
26  }
27  *kmess_sp = *str;
28  kmess_sp ++;
29  str ++;
30  kmess_count ++;
31  count ++;
32  }
33 
34  return count;
35 }
36 
37 static int kputs(unsigned char *str, unsigned int len)
38 {
39 #if 0
40  return write_device(kmess_dev, str, len);
41 #else // LF = CRLF
42  int i;
43 
44  for(i=0; i<len; i++) {
45  if(*str == '\n') {
46  putc_device(kmess_dev, '\r');
47  }
48  putc_device(kmess_dev, *str);
49  str ++;
50  }
51 
52  return i;
53 #endif
54 }
55 
56 /**
57  @brief カーネルメッセージ出力デバイスを登録する
58 
59  @param[in] dev カーネルメッセージ出力デバイス
60 
61  @return 0固定
62 */
64 {
65  kmess_dev = dev;
66  kmess_out = kputs;
67 
68  return 0;
69 }
70 
71 /**
72  @brief カーネルメッセージ出力メモリアドレスを設定する
73 
74  @param[in] mp カーネルメッセージ出力メモリアドレス
75  @param[in] size カーネルメッセージ出力メモリサイズ
76 
77  @return カーネルメッセージ出力メモリサイズ
78 */
79 unsigned int set_kernel_message_out_mem(unsigned char *mp, unsigned int size)
80 {
81  if(mp == 0) {
82  kmess_out = kputs;
83  } else {
84  kmess_sp = mp;
85  kmess_size = size;
86  kmess_count = 0;
87  kmess_out = ksputs;
88  }
89 
90  return kmess_count;
91 }
92 
93 /**
94  @brief 非タスクコンテキスト実行用メッセージ出力
95 
96  @param[in] fmt メッセージフォーマット
97 
98  @return 出力メッセージサイズ
99 */
100 int tkprintf(const char *fmt, ...)
101 {
102  va_list args;
103  int len = 0;
104 
105  va_start(args, fmt);
106  len += vtprintf(kmess_out, fmt, 0, args);
107  va_end(args);
108 
109  return len;
110 }
111 
112 /**
113  @brief 非タスクコンテキスト実行用メモリダンプメッセージ出力
114 
115  @param[in] data ダンプ出力メモリ
116  @param[in] len ダンプ出力メモリサイズ
117 */
118 void kxdump(unsigned char *data, unsigned int len)
119 {
120  vxdump(0, data, len, XDUMP_ADDR_DATA_ADDR, XDUMP_DATA_LONG, tkprintf);
121 }
int write_device(struct st_device *dev, const void *buf, unsigned int count)
デバイスにデータを書き込む
Definition: device.c:451
機能限定printf
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
Definition: tkprintf.c:100
カーネル用機能限定printf
int putc_device(struct st_device *dev, unsigned char data)
デバイスにデータを1バイト書き込む
Definition: device.c:502
unsigned int set_kernel_message_out_mem(unsigned char *mp, unsigned int size)
カーネルメッセージ出力メモリアドレスを設定する
Definition: tkprintf.c:79
int vtprintf(io_write write, const char *fmt, unsigned int size, va_list args)
簡易printf、float,doubleは使えない
Definition: vtprintf.c:55
int register_kmess_out_dev(struct st_device *dev)
カーネルメッセージ出力デバイスを登録する
Definition: tkprintf.c:63
デバイスドライバ構造体
Definition: device.h:25
void kxdump(unsigned char *data, unsigned int len)
非タスクコンテキスト実行用メモリダンプメッセージ出力
Definition: tkprintf.c:118