text: /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  /* GPIO UART debug printf */
  
  #include "common.h"
  #include "printf.h"
  #include "registers.h"
  #include "timer.h"
  #include "util.h"
  
  #define BAUD 38400
  #define BIT_PERIOD (1000000 / BAUD)
  
  int debug_txchar(void *context, int c)
  {
  	int i;
  	timestamp_t st;
  	int32_t d;
  
  	if (c == '\n')
  		debug_txchar(context, '\r');
  
  	c = (c << 1) | (1 << 9);
  	st = get_time();
  	for (i = 0; i < 10; ++i) {
  		STM32_GPIO_BSRR(GPIO_A) = 1 << ((c & 1) ? 15 : 31);
  		d = (int32_t)st.le.lo + BIT_PERIOD * (i + 1) - get_time().le.lo;
  		if (d > 0)
  			udelay(d);
  		c >>= 1;
  	}
  
  	return 0;
  }
  
  void debug_printf(const char *format, ...)
  {
  	va_list args;
  
  	va_start(args, format);
  	vfnprintf(debug_txchar, NULL, format, args);
  	va_end(args);
  }
  
  void panic(const char *msg)
  {
  }
  