astra/f1c100s

The code defines the physical pin layout, labels, and footprint for the F1C100S system-on-chip (SoC) component used in electronic devices.

Version
0.9.2
License
unset
Stars
0

src/pin-map.ts

/** Physical pin numbers from Allwinner F1C100s datasheet Rev 1.0 pp.12-15.
 * Fixed allocation: RGB666, SPI0/PC, SDMMC0/PF, UART0/PE0:1, TWI0/PE11:12.
 */
export const PIN_NETS: Record<number, string> = {
	1: "HPL",
	2: "HPCOM",
	3: "HPCOM",
	4: "VCC_HP",
	5: "VCC_IO",
	20: "VCC_IO",
	22: "VDD_CORE",
	30: "VCC_DRAM",
	31: "VCC_DRAM",
	32: "VCC_DRAM",
	33: "SVREF",
	34: "VCC_DRAM",
	35: "VDD_CORE",
	36: "VCC_DRAM",
	37: "TWI0_SDA",
	38: "TWI0_SCL",
	39: "PE10",
	40: "PE9",
	41: "PE8",
	42: "PE7",
	43: "PE6",
	44: "PE5",
	45: "PE4",
	46: "PE3",
	47: "PE2",
	48: "UART0_TX",
	49: "UART0_RX",
	50: "VCC_IO",
	51: "HOSCI",
	52: "HOSCO",
	53: "SDMMC0_D2",
	54: "SDMMC0_D3",
	55: "SDMMC0_CMD",
	56: "SDMMC0_CLK",
	57: "SDMMC0_D0",
	58: "SDMMC0_D1",
	59: "SPI0_CLK",
	60: "SPI0_CS",
	61: "SPI0_MISO",
	62: "SPI0_MOSI",
	63: "TPY2",
	64: "TPY1",
	65: "TPX2",
	66: "TPX1",
	67: "VCC_USB",
	68: "USB_DM",
	69: "USB_DP",
	70: "RESET",
	71: "VDD_CORE",
	72: "TVOUT",
	73: "VCC_TV",
	74: "GND",
	75: "TV_VRN",
	76: "TV_VRP",
	77: "TVIN1",
	78: "TVIN0",
	79: "LRADC0",
	80: "AVCC",
	81: "VRA1",
	82: "GND",
	83: "VRA2",
	84: "FMINL",
	85: "FMINR",
	86: "LINEIN",
	87: "MICIN",
	88: "HPR",
	89: "GND",
};
const lcdData = [
	2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23,
];
const pdPins = [
	6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 25,
];
pdPins.forEach((pin, i) => {
	PIN_NETS[pin] = `LCD_D${lcdData[i]}`;
});
Object.assign(PIN_NETS, {
	26: "LCD_CLK",
	27: "LCD_DE",
	28: "LCD_HSYNC",
	29: "LCD_VSYNC",
});
export const RAILS = [
	"VCC_HP",
	"VCC_IO",
	"VDD_CORE",
	"VCC_DRAM",
	"VCC_USB",
	"VCC_TV",
	"AVCC",
] as const;
export const INTERNAL_NETS = new Set([
	"HOSCI",
	"HOSCO",
	"SVREF",
	"VRA1",
	"VRA2",
	"TV_VRN",
	"TV_VRP",
]);
export const EXTERNAL_NETS = [...new Set(Object.values(PIN_NETS))].filter(
	(n) => !INTERNAL_NETS.has(n),
);

/** Imported footprint at zero rotation has pin 1 on the bottom-left. */
export function pinPosition(pin: number, rotation: number) {
	let x = 0,
		y = 0;
	if (pin <= 22) {
		x = -4.2 + (pin - 1) * 0.4;
		y = -5;
	} else if (pin <= 44) {
		x = 5;
		y = -4.2 + (pin - 23) * 0.4;
	} else if (pin <= 66) {
		x = 4.2 - (pin - 45) * 0.4;
		y = 5;
	} else if (pin <= 88) {
		x = -5;
		y = 4.2 - (pin - 67) * 0.4;
	}
	const a = (rotation * Math.PI) / 180;
	return {
		x: Math.round((x * Math.cos(a) - y * Math.sin(a)) * 1e6) / 1e6,
		y: Math.round((x * Math.sin(a) + y * Math.cos(a)) * 1e6) / 1e6,
	};
}