A resource burner for (not only) standalone system
pik33            
            
                Posts: 2,416            
            We have a 16 MB flash memory on every(?)  P2 board.
So instead of adding cog drivers and resources in  a DAT or asm shared sections they can be stored in the flash area and loaded on demand,
There is a topic about flash and SD access at the same time: https://forums.parallax.com/discussion/175020/flash-and-microsd-in-the-same-program-how-to-flexprop#latest
First experiments with the burner using available flash object ended with unformatting the (unmounted, unused) SD card in the Edge's slot. I managed to restore the card, but it means the flash access has to be done in Mode 3 or it is not safe for a SD card and I have to add erase and write procedures to the read procedure from the topic mentioned above.
Here is the simple bitbanged Mode 3 flash object:
' A simple bitbanged SPI Mode 3 flash driver
' v. 0.02 - 2022.12.08
' Piotr Kardasz pik33@o2.pl with a help from the P2 community
' read a block (256 bytes) from the flash
' fa - flash address, ha - hub address
pub read_block(fa,ha) | bb,i     
        org
        drvh    #60                   ' clock
        drvh    #61                   ' cs
        drvh    #59                   ' prop->flash
        fltl    #58                   ' flash->prop
        add     fa, ##$03000000       ' 03-read
        outl    #61                   ' select the flash
        rep     @p1, #32              ' send command+address
        rol     fa, #1   wc
        outl    #60
        outc    #59
        outh    #60
p1      mov     pr0,#64               ' read 64 longs 
        outl    #60
        fltl    #59                   
        outh    #60
p3      rep     @p2, #32
        outl    #60
        rcl     fa, #1
        outh    #60
        testp   #58   wc
p2      rcl     fa, #1
        movbyts fa,#%00011011
        wrlong  fa, ha
        add     ha, #4
        djnz    pr0, #p3
        drvh    #61                   ' disable chip select
        end
' erase a 4k block at fa
pub erase_block(fa)
        org
        drvh    #60                   ' clock
        drvh    #61                   ' cs
        drvh    #59                   ' prop->flash
        fltl    #58                   ' flash->prop
        mov     pr0,##$06000000       ' write enable
        outl    #61
        rep     @p6,#8
        rol     pr0,#1 wc
        outl    #60
        outc    #59
        outh    #60
p6  nop
    outh    #61
        waitx   ##$30_000        
        add     fa, ##$20000000      ' 20-erase 4k block
        and     fa, ##$FFFFF000      ' address has to be block aligned 
        outl    #61                  ' select the flash
        rep     @p1, #32
        rol     fa, #1   wc
        outl    #60
        outc    #59
        outh    #60
p1      nop
        outh    #61
        waitx   ##$30_000_000        
        fltl    #59                   ' prop->flash
        end
pub write_block(fa,ha)
        org
        drvh    #60                   ' clock
        drvh    #61                   ' cs
        drvh    #59                   ' prop->flash
        fltl    #58                   ' flash->prop
        mov     pr0,##$06000000
        outl    #61
        rep     @p6,#8
        rol     pr0,#1 wc
        outl    #60
        outc    #59
        outh    #60
p6  nop
    outh    #61
        waitx   ##$30_000    
        add     fa, ##$02000000       ' 02 - write 256 bytes block
        outl    #61                   ' select the flash
        rep     @p1, #32
        rol     fa, #1   wc
        outl    #60
        outc    #59
        outh    #60
p1      mov     pr1,#256
p3      rdbyte  pr0,ha
        shl     pr0,#24
        rep     @p2,#8
        rol     pr0, #1   wc
        outl    #60
        outc    #59
        outh    #60
p2      add     ha,#1
        djnz    pr1,#p3
        outh    #61
        waitx   ##3_000_000
        fltl    #59                   ' prop->flash
        drvh    #60
        end
The burner now burns the HDMI cog driver, font and sprites definition. In the final version I want to have any possible stuff needed for a standalone system: audio drivers, samples, etc.
                  
                            
Comments
Very cool.
Can you give a example how to load the HDMI driver from Spin and/or (better) PASM once it is in the Flash, and have you some sort of Directory/Index in mind?
Very useable idea, I like it much.
Enjoy!
Mike
No, I have no directory, I only prepared a flash memory map
I am now in the process of rewriting the spin code, but this works:
A perecompiled cog code is loaded now from the flash instead of attaching it as DAT section.
This $70000 is the unused memory. Used for testing, the proper way is to allocate 4k of memory, do job, then free it.
This driver uses also a font definitions. In the current state 3 definitions are attached as DAT. I can now preload one of them from the flash on demand and not keeping all of them in the hub.
PSRAM 32 MB driver for P2-EC32MB added to the burner. Burns at $860000. Attached psram_flash.spin2 is a modified version of the high level PSRAM driver file that loads it from the flash instead of using a PASM/Spin driver source code. It uses $7F000 as a temporary storage, but any HUB RAM can do, you need only to adjust the driver address variable
driverAddr:= $7F020which is HUB RAM driver start+$20. Afer the driver is started, the HUB RAM can be discarded and reused