Open source PBP bootloader


Closed Thread
Results 1 to 40 of 41

Hybrid View

  1. #1
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default Oops

    Sorry my earlier post won't work that way, PBP takes 5-36 as subtraction. Probably the closest to the assembly example like this. Then you could specify the address in assembly if need be in a similar PACKET_DATA + x manner. I took the liberty of editing your previous post with that one change. [5-36] to [5]

    Code:
    DATA_BUFF   VAR BYTE[37]        ' Start of receive buffer SAME ADDRESS AS COMMAND
        
    COMMAND     VAR DATA_BUFF[0]    ' Data mapped in receive buffer SAME ADDRESS AS DATA_BYTE
    DATA_COUNT1 VAR DATA_BUFF[1]    
    ADDRESS_L   VAR DATA_BUFF[2]
    ADDRESS_H   VAR DATA_BUFF[3]
    ADDRESS_U   VAR DATA_BUFF[4]
    PACKET_DATA VAR DATA_BUFF[5]    ' DATA_BUFF[5] through DATA_BUFF[36] (32 bytes)
    Last edited by ScaleRobotics; - 4th March 2011 at 17:35.

  2. #2
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

    Default Re: Open source PBP bootloader

    Here is the final installment. I feel like there must be MANY errors, but maybe not. I have not tried to compile yet, I thought maybe you kind folks might give it a look over for glaring errors.
    Code:
    ' *****************************************************************************
    '        Software License Agreement				    
    '		 						    
    ' The software supplied herewith by PBP forum members 	    
    ' (the “Company”) for Microchip's PICmicro® Microcontroller's is 
    ' intended and supplied to you, the Company’s customer, for use     
    ' solely and exclusively on Microchip PICmicro Microcontroller	    
    ' products. The software is owned by the Company and/or its         
    ' supplier, and is protected under applicable copyright laws. All   
    ' rights are reserved. Any use in violation of the foregoing 	     
    ' restrictions may subject the user to criminal sanctions under	    
    ' applicable laws, as well as to civil liability for the breach of  
    ' the terms and conditions of this license.			    
    '								    
    ' THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, 
    ' WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED 
    ' TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 	    
    ' PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, 
    ' IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR 	    
    ' CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.		    
    '								    
    '					 			    
    ' This software has been ported from Microchip's AN851 bootloader
    ' Changes have been made and will be made as the company sees fit.
    ' This version is for 16F's, there is another version for 18F's
    '
    '
    ' Memory Map
    '	-----------------
    '	|    0x0000	|	Reset vector
    '	|        	|
    '   |    0x0004	|	Interrupt vector
    '	|    		|	
    '	|		    |
    '	|Boot Block |	(this program)
    ' 	|		    |
    '	|    0x0200	|	Re-mapped Reset Vector
    '	|    0x0204	|	Re-mapped High Priority Interrupt Vector
    '	|		    |
    '	|   	    |	
    '	|		    |
    '   |Code Space |	User program space
    '	|		    |
    '	|		    |
    '	|		    |
    '	|    0x3FFF |
    '	-----------------
    '
    ' Incomming data format:
    '
    '   {STX}{STX}{DATA}{CHKSUM}{ETX}
    '		      /    \
    '	 ________/      \____________________________
    '	/	                                         \
    '	{COMMAND}{DLEN}{ADDRL}{ADDRH}{ADDRU}{DATA}...
    '
    ' Definitions:
    '
    ' 	STX  	-	Start of packet indicator
    '	ETX 	-	End of packet indicator
    ' 	LEN 	-	Length of incomming packet
    ' 	DATA	-	General data up to 255 bytes
    ' 	CHKSUM 	- 	The 8-bit two's compliment sum of LEN & DATA
    ' 	COMMAND - 	Base command
    ' 	DLEN	-	Length of data associated to the command
    ' 	ADDR	-	Address up to 24 bits
    ' 	DATA 	-	Data (if any)
    '
    '
    ' Commands:
    '
    ' 	RD_VER		00	Read Version Information
    ' 	RD_MEM		01	Read Program Memory
    ' 	WR_MEM		02	Write Program Memory
    ' 	ER_MEM		03	Erase Program Memory (NOT supported by PIC16)
    ' 	RD_EE		04	Read EEDATA Memory 
    ' 	WR_EE		05	Write EEDATA Memory 
    ' 	RD_CONFIG	06	Read Config Memory (NOT supported by PIC16)
    ' 	WT_CONFIG	07	Write Config Memory (NOT supported by PIC16)
    '
    ' ****************************************************************************
    
    ' *****************************************************************************
    PRGADD		VAR WORD
    DATAWORD    VAR WORD
    
    PRGADDL		VAR PRGADD.LOWBYTE
    PRGADDH		VAR PRGADD.HIGHBYTE
    DATAWORDL	VAR DATAWORD.LOWBYTE
    DATAWORDH	VAR DATAWORD.HIGHBYTE
    
    CHKSUM		VAR	BYTE		' Checksum accumulator
    COUNTER		VAR	BYTE		' General counter
    ABTIME		VAR	BYTE
    RXDATA		VAR	BYTE
    TXDATA		VAR	BYTE
    TEMP		VAR	BYTE
    ARRAYPOINTER VAR BYTE
    FAKEW		VAR BYTE
    BIGLOOP 	VAR BYTE
    TEMPFLAG    VAR BIT
    
    PCLATH_TEMP	VAR	BYTE		' Interrupt context
    STATUS_TEMP	VAR	BYTE		' save/restore registers
    W_TEMP		VAR	BYTE
    
    ' Frame Format
    '
    '  {STX}{STX}[{COMMAND}{DATALEN}{ADDRL}{ADDRH}{ADDRU}{...DATA...}]{CHKSUM}{ETX}
    
    DATA_BUFF	VAR	BYTE[37]		' Start of receive buffer SAME ADDRESS AS COMMAND
    	
    COMMAND		VAR	DATA_BUFF[0]		' Data mapped in receive buffer SAME ADDRESS AS DATA_BYTE
    DATA_COUNT	VAR	DATA_BUFF[1]
    ADDRESS_L	VAR	DATA_BUFF[2]
    ADDRESS_H	VAR	DATA_BUFF[3]
    ADDRESS_U	VAR	DATA_BUFF[4]
    PACKET_DATA	VAR	DATA_BUFF[5]	
    ' *****************************************************************************
    
    
    '  This is the remapping section, note the interrupt also saves context
    ' *****************************************************************************
    @	ORG	0x0000			' Re-map Reset vector **Not sure how to set the address to start at
    VReset:
    	PCLATH = 0
    	goto	Setup								
    
    @	ORG	0x0004			'standard interrupt vector **again not sure of the PBP equal for ORG
    VInt:
    	W_TEMP = W			   'I am assuming this will be the "W" register			
    	STATUS_TEMP = STATUS   'We may have trouble here. ASM uses SWAP so as not to affect the status
    	STATUS = 0
    	PCLATH_TEMP = PCLATH
    	PCLATH = 0
    	goto	RVInt	    ' Re-map Interrupt vector		
    
    ' *****************************************************************************
     *****************************************************************************
    ' Setup the appropriate registers.
    Setup:
    	clrwdt
    	READ $ff,temp		         'get the value of last EEPROM location
    	IF temp = $ff then goto SRX  'BL startup
    	goto	RVReset			     ' If not 0xFF then normal reset	
    
    SRX:
    	RCSTA = %10000000		' Setup rx and tx, CREN disabled
    	TRISC.6 = 0 			' Setup tx pin		
    	TXSTA = %00100110			
    	STATUS.IRP = 1
    ' *****************************************************************************
    
    
    ' *****************************************************************************
    Autobaud:
    '
    ' ___	 __________            ________
    '    \__/	       \__________/
    '       |                     |
    '       |-------- p ----------|
    '
    '	p = The number of instructions between the first and last
    '           rising edge of the RS232 control sequence 0x0F. Other 
    '	    possible control sequences are 0x01, 0x03, 0x07, 0x1F, 
    ' 	    0x3F, 0x7F.
    '
    '	SPBRG = (p / 32) - 1  	BRGH = 1
    										
    
    	OPTION_REG = %00000011	'sets tmr0 to 1:16 prescale
    	STATUS.RP0	= 0						
    	RCSTA.CREN = 0							
    
    	gosub	WaitForRise							
    	 
    	TMR0 = 0		     ' Start counting			
    
    	gosub	WaitForRise							
    
    	ABTIME = TMR0		 ' Read the timer		
    	TEMPFLAG = ABTIME.0
    	ABTIME = ABTIME >> 1							
    	IF !TEMPFLAG THEN ABTIME.0 = 0 'Rounding	
    	SPBRG = ABTIME
    	RCSTA.CREN = 1		 ' Enable receive	
    
    	TEMP = RCREG		' To clear the Rx buffer					
    	TEMP = RCREG		' Both of them						
    						
    	OPTION_REG = %11111111 'Return Option Reg to reset state							
    							
    ' *****************************************************************************
    
    
    ' *****************************************************************************
    ' Read and parse the data.
    StartOfLine:						
    	GOSUB	RdRS232			' Look for a start of line	
    	IF RXDATA != STX THEN Autobaud	    '{STX}{STX}				
                     		
        ARRAYPOINTER = 0		' Point to the beginning of Array						
    
    	CHKSUM	= 0     		' Reset checksum		
    		
    GetNextDat:			
    	GOSUB	RdRS232			' Get the data			
    	IF RXDATA = STX	THEN StartOfLine    ' Check for a STX			
    	                		' Yes, start over			
    
    NoSTX:
    	IF RXDATA = ETX THEN CheckSum    ' Check for a ETX			
    								' Yes, examine checksum		
    
    NoETX:
    	IF RXDATA = DLE THEN GOSUB RdRS232 ' Check for a DLE
    	                                   ' Yes, Get the next byte	
    	
    NoDLE:
    	DATA_BUFF[ARRAYPOINTER] = RXDATA   ' Store the data		
    	CHKSUM = CHKSUM + RXDATA           ' Get sum				
    	ARRAYPOINTER = ARRAYPOINTER + 1								
    
    	goto	GetNextDat						
    
    CheckSum:
    	IF CHKSUM = 0 THEN Autobaud  ' Checksum test					
    ' ***********************************************
    
    
    ' ***********************************************
    ' Pre-setup, common to all commands.									
    	PRGADDL = ADDRESS_L		'Set all possible pointers								
    	PRGADDH = ADDRESS_H														
    
    	ARRAYPOINTER = 5        'start of data in array							
    
    	COUNTER = DATA_COUNT 	'Setup counter										
    	IF COUNTER = 0 THEN VReset	'Non valid count (Special Command)	
    ' ***********************************************
    
    ' ***********************************************
    ' Test the command field and sub-command.					
    CheckCommand
    	IF COMMAND } 7 THEN Autobaud ' Test for a valid command									
    	SELECT CASE COMMAND          ' Perform calculated jump		
    		CASE 0
    			goto	ReadVersion		' 0					
    		CASE 1
    			goto	ReadProgMem		' 1					
    		CASE 2
    			goto	WriteProgMem	' 2					
    		CASE 3
    			goto	StartOfLine		' 3					
    		CASE 4
    			goto	ReadEE			' 4					
    		CASE 5
    			goto	WriteEE			' 5					
    		CASE 6
    			goto	StartOfLine		' 6					
    		CASE 7
    			goto	StartOfLine		' 7					
    	'maybe add jump to reset vector in this table
    '***********************************************
    
    
    
    ' ***********************************************
    ' Commands
    ' ************* Read Version
    ' In:	{STX}{STX}[{0x00}{0x02}]{0xFF}{ETX}
    ' OUT:	{STX}{STX}[{0x00}{VERL}{VERH}]{CHKSUM}{ETX}
    ReadVersion:								
    	DATA_BUFF[2] = MINOR_VERSION														
    	DATA_BUFF[3] = MAJOR_VERSION														
    
    	FAKEW = 4								
    	goto	WritePacket							
    
    '*************Read Program Memory
    	
    ' In:	{STX}{STX}[{0x01}{DLEN}{ADDRL}{ADDRH}{ADDRU}]{CHKSUM}{ETX}
    ' OUT:	{STX}{STX}[{0x01}{DLEN}{ADDRL}{ADDRH}{ADDRU}{DATA}...]{CHKSUM}{ETX} 
    ReadProgMem:								
    RPM1:
    	READCODE PRGADD,DATAWORD
    													
    	DATA_BUFF[ARRAYPOINTER] = DATAWORDL							
    	DATA_BUFF[ARRAYPOINTER + 1] = DATAWORDH							
    	ARRAYPOINTER = ARRAYPOINTER + 2								
    	PRGADD = PRGADD + 1
    
    	COUNTER = COUNTER - 1							
    	IF COUNTER } 0 THEN RPM1			' Not finished then repeat	
    
    	DATA_COUNT = (DATA_COUNT << 1) + 5	' Setup packet length		
    					
    	goto	WritePacket						
    
    '************* Write Program Memory
    
    
    ' In:	{STX}{STX}[{0x02}{DLENBLOCK}{ADDRL}{ADDRH}{ADDRU}{DATA}...]{CHKSUM}{ETX}
    ' OUT:	{STX}{STX}[{0x02}]{CHKSUM}{ETX}
    WriteProgMem:	
    	FOR BIGLOOP = COUNTER TO 0 STEP -1
    		EECON1 = %10000100				' Setup writes				
    		EEADR = EEADR & %11111100		' Force a boundry			' B2
    		FOR TEMP = 1 TO 4
    			WRITECODE PRGADD,DATAWORD[ARRAYPOINTER]
    			ARRAYPOINTER = ARRAYPOINTER + 2
    		NEXT 
    	
    	NEXT
    	goto	SendAcknowledge				' Send acknowledge			
    
    '************** Read EE
    
    
    ' In:	{STX}{STX}[{0x04}{DLEN}{ADDRL}{ADDRH}{0x00}]{CHKSUM}{ETX}
    ' OUT:	{STX}{STX}[{0x04}{DLEN}{ADDRL}{ADDRH}{0x00}{DATA}...]{CHKSUM}{ETX}
    ReadEE:			
    	FOR BIGLOOP = COUNTER TO 0 STEP -1
    		READ PRGADD,DATA_BUFF[ARRAYPOINTER]
    		ARRAYPOINTER = ARRAYPOINTER + 1
    		PRGADD = PRGADD + 1
    	NEXT
    	
    	FAKEW = DATA_COUNT + 5
    	GOTO WritePacket
    
    
    ' In:	<STX><STX>[<0x05><DLEN><ADDRL><ADDRH><0x00><DATA>...]<CHKSUM><ETX>
    ' OUT:	<STX><STX>[<0x05>]<CHKSUM><ETX>
    WriteEE:
    	FOR BIGLOOP = 0 TO COUNTER
    		WRITE PRGADD + BIGLOOP,DATA_BUFF[ARRAYPOINTER+BIGLOOP]
    	NEXT
    	goto	SendAcknowledge		; Send acknowledge			
    	
    ' ***********************************************
    
    ' ***********************************************
    ' Send the data buffer back.
    '
    ' {STX}{STX}[{DATA}...]{CHKSUM}{ETX}
    
    SendAcknowledge:								
    	FAKEW = 1			' Send acknowledge		
    	
    WritePacket:
    	COUNTER = FAKEW	
    
    	FAKEW = STX			' Send start condition	
    	GOSUB	WrRS232								
    	GOSUB	WrRS232								
    
    	CHKSUM = 0			' Reset checksum	
    	ARRAYPOINTER = 0
    	
    SendNext:				' Send DATA
    	FOR BIGLOOP = 1 TO COUNTER
    		FAKEW = DATA_BUFF[ARRAYPOINTER]
    		CHKSUM = CHKSUM + FAKEW 
    		GOSUB	WrData				
    	NEXT
    
    '********************************************
    	comf	CHKSUM,W		' Send checksum		
    	addlw	0x01	   ' NEEDS CONVERTING!!!!!
    '***********************************************	
    	GOSUB	WrData								
    
    	FAKEW =	ETX			' Send stop condition	
    	GOSUB	WrRS232								
    
    	goto	Autobaud							
    ' *****************************************************************************
    
    ' *****************************************************************************
    ' Write a byte to the serial port.
    
    WrData:										
    	TXDATA = FAKEW			' Save the data			
    	IF FAKEW = STX THEN WrDLE
    	IF FAKEW = ETX THEN WrDLE
    	IF FAKEW != DLE THEN WrNext
    	
    WrDLE:
    	GOSUB	WrRS232		'Send DLE					
    
    WrNext:
    	FAKEW =	TXDATA	' Then send DATA				
    
    WrRS232:										
    	clrwdt									
    	WHILE !PIR1.TXIF WEND ' Write only if TXREG is ready		
    
    	TXREG = FAKEW			' Start sending				
    
    	return									
    ' *****************************************************************************
    
    
    
    ' *****************************************************************************
    RdRS232:			
    	clrwdt
    
    	IF RCSTA.OERR THEN VReset		' Reset on overun	
    
    	WHILE !PIR1.RCIF WEND	' Wait for data from RS232
    	
    
    	RXDATA = RCREG		' Save the data		
    	return									
    ' *****************************************************************************
    
    
    
    
    ' *****************************************************************************
    WaitForRise:
    	WHILE PORTC.7 WEND   ' Wait for a falling edge	
    	clrwdt				 ' Do we need this?
    	WHILE !PORTC.7 WEND	 ' Wait for starting edge	
    	return				
    ' *****************************************************************************
    
    ' I DON'T THINK WE NEED THE NEXT 2 SECTIONS
    ' CAN ANYBODY TELL ME?
    
    
    ' *****************************************************************************
    ' Unlock and start the write or erase sequence.
    
    StartWrite									; B3
    	clrwdt									; B2
    	bsf	STATUS,RP0							; B3
    	movlw	0x55			; Unlock				; B3
    	movwf	EECON2								; B3
    	movlw	0xAA								; B3
    	movwf	EECON2								; B3
    	bsf	EECON1,WR		; Start the write			; B3
    	nop									; B3
    	nop									; B3
    	bcf	STATUS,RP0							; B2
    	return									; B2
    ; *****************************************************************************
    
    
    
    
    ; *****************************************************************************
    WriteWaitEEData									; B2
    	bsf	STATUS,RP0							; B3
    	movlw	b'00000100'		; Setup for EEData			; B3
    	movwf	EECON1								; B3
    	call	StartWrite							; B3
    	btfsc	EECON1,WR		; Write and wait			; B3
    	goto	$ - 1								; B3
    	bcf	STATUS,RP0							; B2
    	return									; B2
    ; *****************************************************************************
    
    
    ; *****************************************************************************
    RVReset:
    	@ORG	0x100
    					
    RVInt:
    	@ORG	0x104
    
    
    ; *****************************************************************************
    
    
    	END
    Attached Files Attached Files
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  3. #3
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

    Default Re: Open source PBP bootloader

    This one compiles up to MPASM part, then PLENTY of overwrite errors.


    BTW, is it odd we can't attach .PBP files?
    Attached Files Attached Files
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default Re: Open source PBP bootloader

    Hint: ASM ORG & PBP (see mostcompilers) are poor bedfellows when you don't know why and how they interract.

    Plausible solution, compile without ORG, use the HEX to get the ASM code, then add some ORG & GOTO, recompile the asm and try to make it work

    Still Plausible: Hack a .LIB and or .INC to use Labels in your Bootloader code instead of ORG.

    Lots of possibilities, my favourites being 100% pure ASM.
    Last edited by mister_e; - 6th March 2011 at 21:17.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

    Default Re: Open source PBP bootloader

    Quote Originally Posted by mister_e View Post
    Hint: ASM ORG & PBP (see mostcompilers) are poor bedfellows when you don't know why and how they interract.
    Well I must admit not knowing. I know it makes no sense to use it in this way, I know PBP won't be paying attention to it, therefore probable conflicts will arrise.
    Plausible solution, compile without ORG, use the HEX to get the ASM code, then add some ORG & GOTO, recompile the asm and try to make it work
    This sounds like a quick fix not in line with the intention of this project.
    Still Plausible: Hack a .LIB and or .INC to use Labels in your Bootloader code instead of ORG.
    If we can have the hack as part of the "package" maybe. Right now it seems more then too much to ask folks to rem out config lines

    Lots of possibilities, my favourites being 100% pure ASM.
    we already have that. The purpose here is to try and make a PBP bootloader, for all to use and abuse.

    Thanks for pointing in the direction of the first of many (maybe) problems. I feel like I saw something in the PBP bible about defining code locations, but it is at work
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  6. #6
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default Re: Open source PBP bootloader

    Well, there's an easy alternative. Compile your bootloader without ORG, see how much code space it needs. Once you know it, add an ORG at the END of your bootloader + Label. Your bootloader must jump to this Label when it exit.

    Code:
    'bootloader code here
    Goto GetOutOfHere
    
    @ ORG WhateverYouDecide 
    GetOutOfHere:
    Now when you want to use the bootloader, in your application code you need to use DEFINE RESET_ORG... and Period.

    Code:
    DEFINE RESET_ORG WhateverYouDecide
    ' and your application code goes there
    Now go figure how interrupt will work and how to integrate it, have fun!
    http://www.picbasic.co.uk/forum/show...1662#post31662

    Readme.txt:
    ORG Define

    It may sometimes be useful to move the start of the generated code to a
    location other than 0. This can be used to move the program code beyond
    a boot loader, for example. A Define has been added to the compiler to
    allow a different reset address to be specified for the 14-bit core PIC
    MCUs and the PIC18 parts.

    Define RESET_ORG 100h

    This Define moves the starting location of the program, the reset vector,
    to the specified address. The interrupt vector(s) follow at their usual
    offset, followed by the library and program code.

    For 14-bit core devices with more than 2K of code space, only interrupts
    in assembler may be used. On Interrupt will not work properly if the
    device has more than 2K of code space and RESET_ORG is not 0. For
    assembler interrupts in a device with more than 2K of code space and
    RESET_ORG something other than 0, the values of W, STATUS and PCLATH must
    be saved by whatever program now resides at the PIC MCU's fixed vector
    locations before the jump to the new vector location. In general, the
    save locations are named wsave, ssave and psave. The information on these
    save locations should be provided with the boot loader or whatever program
    requires the altered origination so that the register values may be restored
    at the end of interrupt processing.

    For 14-bit enhanced core devices with more than 2K of code space,
    On Interrupt may be used but the values of W, STATUS and PCLATH must not be
    changed to get to the interrupt vector as they will not be restored upon
    return from the interrupt. This usually means bra will be used to jump to
    the new interrupt vector location. Interrupts in assembler do not require
    any special treatment.

    Either 14-bit core PBP library must fit into the first 2K of code space.
    The PIC18 PBP library must fit into the first 32K of code space. It is best
    for RESET_ORG to start on an even 256 word boundary.
    Last edited by mister_e; - 7th March 2011 at 04:05. Reason: link
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  7. #7
    Join Date
    Jan 2006
    Location
    Toronto
    Posts
    109


    Did you find this post helpful? Yes | No

    Default Re: Open source PBP bootloader

    Are you just converting the exsisting serial bootloader over to PBP? I had thought you were going to make a new bootloader from scratch in pure PBP.

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts