From 470457e22a1b5537013603d5e367c51e47bb61bf Mon Sep 17 00:00:00 2001 From: James Date: Mon, 5 May 2014 17:50:20 +0100 Subject: fish --- libdpf/dpf.h | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 libdpf/dpf.h (limited to 'libdpf/dpf.h') diff --git a/libdpf/dpf.h b/libdpf/dpf.h new file mode 100644 index 0000000..d8d698d --- /dev/null +++ b/libdpf/dpf.h @@ -0,0 +1,189 @@ +/** 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 + + + -- cgit v1.2.3