Tootfinder

Opt-in global Mastodon full text search. Join the index!

@whitequark@mastodon.social
2025-07-22 03:11:35

the web port of #GlasgowInterfaceExplorer can now operate on your local filesystem! (Chrome only)

screencast of reading an SPI flash that creates a data.bin file on the local, native filesystem
@whitequark@mastodon.social
2025-07-20 20:29:01

good news: the webusb version of #GlasgowInterfaceExplorer software is now more or less as fast as native (the latency is a bit worse)
bad news: i have no idea why. i didn't do anything

benchmark results
@whitequark@mastodon.social
2025-07-19 21:33:53

#GlasgowInterfaceExplorer WebUSB port progress

@whitequark@mastodon.social
2025-07-19 02:28:00

do i know any people who:
(a) have modern web development experience
(b) like #GlasgowInterfaceExplorer or just want to do something fairly simple and useful
(c) want to work with me on a new piece of the project?

@whitequark@mastodon.social
2025-07-17 20:37:33

so, i ported #GlasgowInterfaceExplorer to webusb

screenshot of chrome devtools with a glasgow log and some demo output
@whitequark@mastodon.social
2025-07-10 13:38:21

#GlasgowInterfaceExplorer now has API documentation for most V2 applets published online! glasgow-embedded.org/latest/ap

@whitequark@mastodon.social
2025-07-10 04:48:09

check out the (new, not merged yet) #GlasgowInterfaceExplorer I²C controller documentation! whitequark.github.io/glasgow/r

@whitequark@mastodon.social
2025-06-07 04:59:49

i've upgraded the Ethernet controller applet for #GlasgowInterfaceExplorer
this is the main loop of the applet working in bridge mode (acting as a network card for your PC). no weird optimizations, no hacks, just a loop that forwards packets in normal boring Python
on a 100BASE-T link, i get ~95.5 Mbps [saturated link] of upload bandwidth and ~70 Mbps of downlo…

    async def run(self, args):
        if args.operation == "bridge":
            os_iface = OSNetworkInterface(args.interface)

            async def forward_rx():
                async for packet in self.eth_iface.iter_recv():
                    if len(packet) >= 14: # must be at least ETH_HLEN, or we'll get EINVAL on Linux
                        await os_iface.send([packet])

            async def forward_tx():
                while True:
                    for packet in await os_iface.re…
@whitequark@mastodon.social
2025-06-04 23:22:01

it is now possible to set arbitrary strap pins with #GlasgowInterfaceExplorer! use `glasgow multi <...> gpio --pins B0:3 B0=0 B1=H B2=L B3=1` to strap B0 strong low, B1 weak high, B2 weak low, B3 strong high
the GPIO applet doesn't take up USB endpoint resources, so this is "free": you can append ` gpio` to any applet command line you'd like

@whitequark@mastodon.social
2025-06-02 22:08:23

i don't personally do retrocomputing but a lot of the design for #GlasgowInterfaceExplorer is made with an explicit purpose of making retrocomputing nicer (for example, the support for true 5 V TTL that we went to great lengths to preserve, vs. only supporting 3.3 V at most)
i'm quite happy to add support for more retro interfaces to it too

@whitequark@mastodon.social
2025-05-30 23:49:21

does anyone here want support for Arm SWO pin in #GlasgowInterfaceExplorer?

@whitequark@mastodon.social
2025-06-28 15:44:43

are you a platform/embedded developer?
do you need to interact with hardware in a semi-custom manner?
would you like to suffer a lot less doing it?
if so, #GlasgowInterfaceExplorer might be for you. the code below is all you need to build a custom testbench for a DUT you've never seen before. just as easily you can add JTAG/SWD debug, protocol analyzers, etc.…

async def main():
    assembly = HardwareAssembly()
    assembly.use_voltage({"A": 3.3, "B": 3.3})
    spi_rom_iface = Memory25xInterface(logger, assembly,
        cs="A0", sck="A1", io="A2:5")
    uart_iface = UARTInterface(logger, assembly,
        rx="B0", tx="B1")
    gpio_iface = GPIOInterface(logger, assembly,
        pins="B2")

    async with assembly:
        await spi_rom_iface.qspi.clock.set_frequency(1_000_000)
        await uart_iface.set_baud(115200)

        # Pretend to program …