AnasSarkiz/muse-voice-remote

Muse Voice Remote — bare ESP32-S3R8, 155 TOP JLCPCB parts with real supplier CAD, native 3D assembly and GLB exports. Revised 17 mm case allocation; 0.30 mm via drill /0.45 mm pad. Checked prototype PCB; mechanical, RF and MUSE qualification pending.

Version
1.3.2
License
unset
Stars
0

design/chip.ts

import type { Part } from "./parts"

// ESP32-S3 Series Datasheet v1.9, Table 2-1 (physical QFN56 pins).
// GPIO15/16 and GPIO47/48 are mux aliases of the supplier's clock pin labels.
export const bareChipPins: Record<string,string> = {
  "1":"LNA_IN","2":"VDD3P3","3":"VDD3P3","4":"CHIP_PU",
  ...Object.fromEntries(Array.from({length:15},(_,i)=>[String(i+5),`GPIO${i}`])),
  "20":"VDD3P3_RTC","21":"GPIO15","22":"GPIO16","23":"GPIO17","24":"GPIO18",
  "25":"GPIO19","26":"GPIO20","27":"GPIO21","28":"SPICS1","29":"VDD_SPI",
  "30":"SPIHD","31":"SPIWP","32":"SPICS0","33":"SPICLK","34":"SPIQ","35":"SPID",
  "36":"GPIO48","37":"GPIO47","38":"GPIO33","39":"GPIO34","40":"GPIO35","41":"GPIO36",
  "42":"GPIO37","43":"GPIO38","44":"MTCK","45":"MTDO","46":"VDD3P3_CPU",
  "47":"MTDI","48":"MTMS","49":"U0TXD","50":"U0RXD","51":"GPIO45","52":"GPIO46",
  "53":"XTAL_N","54":"XTAL_P","55":"VDDA","56":"VDDA","57":"GND",
}

let schematicIndex = 0
function passive(kind: NonNullable<Part["kind"]>, name:string,value:string,x:number,y:number,
  a:string,b:string,rotation=0): Part {
  const index = schematicIndex++
  return {kind,name,value,x,y,rotation,schX:-37+(index%12)*6.5,schY:-90-Math.floor(index/12)*6,
    physicalPins:{"1":"pin1","2":"pin2"},nets:{pin1:a,pin2:b},
    status:"Imported chip-level support part; RF/clock tuning and hardware validation remain required."}
}

export const chipSupport: Part[] = [
  passive("resistor","R_VDD_SPI_EXT","0",2.5,-5.5,"V3_3","VDD_SPI_3V3"),
  {name:"U_FLASH",value:"W25Q64JVSSIQ",x:13.5,y:-0.5,rotation:90,schX:23,schY:30,
    physicalPins:{"1":"CS","2":"Q","3":"WP","4":"GND","5":"D","6":"CLK","7":"HD","8":"VCC"},
    nets:{CS:"FLASH_CS",Q:"FLASH_Q",WP:"FLASH_WP",GND:"GND",D:"FLASH_D",CLK:"FLASH_CLK",HD:"FLASH_HD",VCC:"VDD_SPI_3V3"},
    status:"Separate 8 MB, 3.3 V Quad-SPI flash; boot and signal timing need hardware validation."},
  {name:"Y1",value:"X322540MPB4SI",x:0,y:10.25,schX:-7,schY:31,
    physicalPins:{"1":"XIN","2":"GND","3":"XOUT","4":"GND"},
    nets:{XIN:"XTAL_P",XOUT:"XTAL_N",GND:"GND"},
    status:"40 MHz, CL=15 pF, ±10 ppm initial tolerance. 22 pF load capacitors assume 4 pF stray; tune frequency on hardware."},
  {name:"J_RF",value:"U.FL-R-SMT-1(10)",x:-13,y:5.40003765,rotation:90,schX:-22,schY:31,
    physicalPins:{"1":"GND","2":"RF","3":"GND"},nets:{GND:"GND",RF:"RF_ANT"},
    status:"Imported 50-ohm external-antenna connector; coax, antenna location and assembled RF performance remain to qualify."},
  passive("inductor","L_RF_MATCH","2nH",-6.75,4.600071,"RF_ANT","RF_LNA"),
  passive("capacitor","C_RF_LNA","1.2pF",-4.8,4.179955,"RF_LNA","GND",-90),
  passive("capacitor","C_RF_ANT","1.2pF",-8.65,4.179955,"RF_ANT","GND",-90),
  passive("diode","D_RF_ESD","PESD5V0C1USFYL",-10,4.36,"GND","RF_ANT",-90),
  passive("inductor","L_XTAL","24nH",-1.8,7.25,"XTAL_P_CHIP","XTAL_P",90),
  passive("capacitor","C_XTAL_P","22pF",-3,10.25,"XTAL_P","GND",90),
  passive("capacitor","C_XTAL_N","22pF",3,10.25,"XTAL_N","GND",-90),
  passive("inductor","L_ANA","2nH",-5,-1,"V3_3","RF_3V3",90),
  passive("capacitor","C_ANA1","1uF",-6.125,-0.25,"RF_3V3","GND",-90),
  passive("capacitor","C_ANA2","100nF",-5,2.75,"RF_3V3","GND",-90),
  passive("capacitor","C_ANA3","100nF",-5,7,"RF_3V3","GND",-90),
  passive("capacitor","C_VDDA1","1uF",-6.2,6.55,"V3_3","GND",180),
  passive("capacitor","C_VDDA2","10nF",-3.25,9.5,"V3_3","GND",90),
  passive("capacitor","C_CPU","100nF",5,6,"V3_3","GND",90),
  passive("capacitor","C_SPI1","100nF",5,-3.5,"VDD_SPI_3V3","GND",90),
  passive("capacitor","C_SPI2","1uF",2.2,-6.45,"VDD_SPI_3V3","GND",-90),
  passive("capacitor","C_FLASH","100nF",12,-5.25,"VDD_SPI_3V3","GND"),
  ...["HD","WP","CS","CLK","Q","D"].map((signal,i)=>
    passive("resistor",`R_FLASH_${signal}`,"0",7,-3.5+i*1.5,
      `FLASH_${signal}_HOST`,`FLASH_${signal}`)),
  passive("resistor","R_STRAP45","10k",5,8.5,"STRAP_VDD_SPI","GND",90),
  passive("resistor","R_STRAP46","10k",5,10.5,"BOOT_IO46","GND",90),
]

export const chipFixedNames = new Set(["U1","U_FLASH","Y1","J_RF","L_RF_MATCH","C_RF_LNA",
  "C_RF_ANT","D_RF_ESD","L_XTAL","C_XTAL_P","C_XTAL_N",
  ...chipSupport.filter(p=>p.name.startsWith("R_FLASH_")).map(p=>p.name)])