view target-utils/libcommon/uartsel.c @ 965:2969032bdfac

fcup-smsend[mult]: fix buglet in K&R C NULL pointer passing The only 100% safe way to pass a NULL pointer as a function argument in K&R C is to cast 0 to a pointer type; failing to do so may cause mysterious bugs (invalid stack frames or garbage in argument registers) on 64-bit machines. This issue has already been fixed in most of FC host tools, but I just found some missed spots: passing of NULL UDH to PDU encoding functions in fcup-smsend[mult] in the case of single (not concatenated) SMS.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 01 Sep 2023 07:33:51 +0000
parents 2942c5ef76ed
children
line wrap: on
line source

/*
 * uart_select_init() figures out which UART was used to load us
 * through the boot ROM, and sets things up for us to use the same
 * UART for our communication.
 */

#include "types.h"
#include "romvars.h"
#include "ns16550.h"
#include "halt.h"

extern struct ns16550_regs *uart_base;

static u16 rom_version;
static struct boot_rom_vars *rom_vars;
static char *uart_name;

uart_select_init()
{
	rom_version = *(const u16 *)0x1FFE;

	switch (rom_version) {
	case 0x0200:
		rom_vars = (struct boot_rom_vars *) 0x800504;
		break;
	case 0x0300:
		rom_vars = (struct boot_rom_vars *) 0x800518;
		break;
	default:
		_exit(HALTCODE_BOOTROMVER);
	}

	switch (rom_vars->uart_id) {
	case 0:
		uart_base = (struct ns16550_regs *) 0xFFFF5800;
		uart_name = "MODEM";
		break;
	case 1:
		uart_base = (struct ns16550_regs *) 0xFFFF5000;
		uart_name = "IrDA";
		break;
	default:
		_exit(HALTCODE_INVALIDUART);
	}
}

print_boot_rom_info()
{
	printf("Loaded via boot ROM v%04X, UART %d (%s) at baud rate #%d\n",
		rom_version, rom_vars->uart_id, uart_name,
		rom_vars->baud_rate_code);
	printf("CLKTCXO input autodetected to be %d MHz\n",
		rom_vars->clktcxo_13mhz ? 13 : 26);
}