/** libdpf header file * * (c) 2010, 2011 * */ #include #include #include "usbuser.h" #include "spiflash.h" #define ADDR unsigned int #define MODE_SG 0x00 ///< generic device mode (original) #define MODE_USB 0x01 ///< libusb operation mode (hacked) #define MODE_USBHID 0x02 ///< libusb HID boot mode #define FLAG_CAN_LOCK 0x80 ///< Has the locking feature (new firmware) enum { DEVERR_FILE = -16, DEVERR_OPEN, DEVERR_HEX, DEVERR_CHK, DEVERR_IO, DEVERR_MALLOC, DEVERR_TIMEOUT, DEVERR_UNSUPP, }; /** The DPF context structure */ struct dpf_context; #define DPFHANDLE struct dpf_context * typedef struct { int (*mem_read) (DPFHANDLE h, unsigned char *buf, ADDR offset, int len); int (*mem_write) (DPFHANDLE h, ADDR dst, const unsigned char *buf, unsigned short n); int (*go) (DPFHANDLE h, ADDR start); int (*bootstrap) (DPFHANDLE h, ADDR dest, unsigned char *src, unsigned short n, ADDR start); int (*flash_probe) (DPFHANDLE h, unsigned char *id); int (*flash_cmd) (DPFHANDLE h, int command, int cmdlen, ADDR addr); int (*flash_status) (DPFHANDLE h, uint8_t * status); int (*flash_read) (DPFHANDLE h, uint8_t * buf, ADDR offset, int len); int (*flash_writechunk) (DPFHANDLE h, const uint8_t * buf, ADDR offset, int len); int (*flash_lock) (DPFHANDLE h, char enable); } AccessMethods; typedef struct dpf_context { unsigned char mode; unsigned char flags; union { usb_dev_handle *udev; int fd; } dev; AccessMethods methods; unsigned int width; unsigned int height; int bpp; int proto; char *buff; unsigned char *oldpix; int offx; int offy; } DPFContext; /** A value proxy for the property API */ typedef struct dpf_proxy { union { short integer; char *sequence; } value; char type; } DPFValue; enum { TYPE_INTEGER, TYPE_STRING, }; /** Opens the DPF device. if dev is not NULL, open device, otherwise, look for USB device. */ int dpf_open (const char *dev, DPFHANDLE * h); /** Close DPF device */ void dpf_close (DPFHANDLE h); /** Set color register * \param rgb RGB tuple */ int dpf_setcol (DPFHANDLE h, const unsigned char *rgb); /** Blit data to screen * * \param buf buffer to 16 bpp RGB 565 image data * \param rect rectangle tuple: [x0, y0, x1, y1] */ int dpf_screen_blit (DPFHANDLE h, const unsigned char *buf, short rect[4]); /** Set property on DPF * \param token Property token * \param value Pointer to value */ int dpf_setproperty (DPFHANDLE h, int token, const DPFValue * value); /* USB raw */ int emulate_scsi (usb_dev_handle * d, unsigned char *cmd, int cmdlen, char out, unsigned char *data, unsigned long block_len); const char *dev_errstr (int err); // Private stuff: int dpf_usb_open (int index, usb_dev_handle ** u); int sgdev_open (const char *portname, int *fd); int usb_rawread (usb_dev_handle * dev, unsigned char *buf, int len); int usb_rawwrite (usb_dev_handle * dev, const unsigned char *buf, int len); int probe (DPFHANDLE h); //////////////////////////////////////////////////////////////////////////// // Bootloader functionality int bl_go (DPFContext * dpf, uint16_t jmpoffset); //////////////////////////////////////////////////////////////////////////// // FLASH stuff // Maximum size for flash_read #define MAX_CHUNKSIZE 0x10000 int read_mem (DPFHANDLE h, unsigned char *buf, ADDR src, unsigned short len); int write_mem (DPFHANDLE h, ADDR dst, const unsigned char *buf, unsigned short len); int load_hexfile (DPFHANDLE h, const char *hexfile); int code_go (DPFHANDLE h, ADDR start); int dpf_bootstrap (DPFHANDLE h, ADDR dst, unsigned char *src, unsigned short n, ADDR start); int flash_cmd (DPFHANDLE h, int command, int cmdlen, ADDR addr); int flash_probe (DPFContext * h, unsigned char *id); int flash_erase (DPFHANDLE h, ADDR offset); int flash_erase_full (DPFHANDLE h); int flash_write (DPFHANDLE h, const unsigned char *buf, ADDR offset, int len); int flash_read (DPFHANDLE h, unsigned char *buf, ADDR offset, int len); int load_ihx (DPFHANDLE h, const char *fname, unsigned char *data, unsigned int *buflen, unsigned int reloc); int patch_sector (DPFHANDLE h, ADDR reloc, unsigned long addr, const char *hexfile); //////////////////////////////////////////////////////////////////////////// /* DPF specific stuff: */ #define RGB565_0(r, g, b) \ (( ((r) & 0xf8) ) | (((g) & 0xe0) >> 5)) #define RGB565_1(r, g, b) \ (( ((g) & 0x1c) << 3 ) | (((b) & 0xf8) >> 3)) #define RGB565(r, g, b) { RGB565_0(r, g, b), RGB565_1(r, g, b) } #define RGB565_S(r, g, b) ((RGB565_0(r, g, b) << 8) | RGB565_1(r, g, b)) int dpfcpy (ADDR dst, unsigned char *src, unsigned short n); // int clr_screen(DPFHANDLE h, const unsigned char *col); int write_screen (DPFHANDLE h, const unsigned char *buf, unsigned int len); // Some internal address offsets. They may change, but so far all types // seem to have the same // // w: word, : length, [LE, BE] // // FIXME: Use packed struct later. // FIXME: Should be 0x0020, once we have the firmware replaced #define OFFSET_PROPS 0x3f0020 ///< w[2]:LE : Resolution X, Y