mirror of
git://projects.qi-hardware.com/xburst-tools.git
synced 2024-11-25 19:18:05 +02:00
foobar
This commit is contained in:
parent
9aa52b7947
commit
f040ec232f
61
usbboot/src/mem.c
Normal file
61
usbboot/src/mem.c
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "ingenic_usb.h"
|
||||||
|
|
||||||
|
#define MEM_WRITE 0
|
||||||
|
#define MEM_READ 1
|
||||||
|
|
||||||
|
#define MEM_8BIT (0 << 1)
|
||||||
|
#define MEM_16BIT (1 << 1)
|
||||||
|
#define MEM_32BIT (2 << 1)
|
||||||
|
|
||||||
|
static void mem_write(struct ingenic_dev *dev, uint32_t addr, uint32_t val, unsigned int width)
|
||||||
|
{
|
||||||
|
char ret[8];
|
||||||
|
usb_send_data_address_to_ingenic(dev, addr);
|
||||||
|
usb_send_data_length_to_ingenic(dev, val);
|
||||||
|
usb_ingenic_mem_ops(dev, MEM_WRITE | width);
|
||||||
|
usb_read_data_from_ingenic(dev, ret, ARRAY_SIZE(ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t mem_read(struct ingenic_dev *dev, uint32_t addr, unsigned int width)
|
||||||
|
{
|
||||||
|
char ret[8];
|
||||||
|
usb_send_data_address_to_ingenic(dev, addr);
|
||||||
|
usb_ingenic_mem_ops(dev, MEM_READ | width);
|
||||||
|
usb_read_data_from_ingenic(dev, ret, ARRAY_SIZE(ret));
|
||||||
|
|
||||||
|
return (((unsigned char)ret[3]) << 24) | (((unsigned char)ret[2]) << 16) |
|
||||||
|
(((unsigned char)ret[1]) << 8) | ((unsigned char)ret[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_write8(struct ingenic_dev *dev, uint32_t addr, uint8_t val)
|
||||||
|
{
|
||||||
|
mem_write(dev, addr, val, MEM_8BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_write16(struct ingenic_dev *dev, uint32_t addr, uint16_t val)
|
||||||
|
{
|
||||||
|
mem_write(dev, addr, val, MEM_16BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_write32(struct ingenic_dev *dev, uint32_t addr, uint32_t val)
|
||||||
|
{
|
||||||
|
mem_write(dev, addr, val, MEM_32BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t mem_read8(struct ingenic_dev *dev, uint32_t addr)
|
||||||
|
{
|
||||||
|
uint8_t val = mem_read(dev, addr, MEM_8BIT) & 0xff;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t mem_read16(struct ingenic_dev *dev, uint32_t addr)
|
||||||
|
{
|
||||||
|
return mem_read(dev, addr, MEM_16BIT) & 0xffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t mem_read32(struct ingenic_dev *dev, uint32_t addr)
|
||||||
|
{
|
||||||
|
return mem_read(dev, addr, MEM_32BIT);
|
||||||
|
}
|
13
usbboot/src/mem.h
Normal file
13
usbboot/src/mem.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef __MEM_H
|
||||||
|
#define __MEM_H
|
||||||
|
|
||||||
|
struct ingenic_dev;
|
||||||
|
|
||||||
|
void mem_write32(struct ingenic_dev *dev, uint32_t addr, uint32_t val);
|
||||||
|
void mem_write16(struct ingenic_dev *dev, uint32_t addr, uint16_t val);
|
||||||
|
void mem_write8(struct ingenic_dev *dev, uint32_t addr, uint8_t val);
|
||||||
|
uint32_t mem_read32(struct ingenic_dev *dev, uint32_t addr);
|
||||||
|
uint16_t mem_read16(struct ingenic_dev *dev, uint32_t addr);
|
||||||
|
uint8_t mem_read8(struct ingenic_dev *dev, uint32_t addr);
|
||||||
|
|
||||||
|
#endif
|
120
usbboot/src/server.c
Normal file
120
usbboot/src/server.c
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
#include "cmd.h"
|
||||||
|
#include "ingenic_usb.h"
|
||||||
|
#include "ingenic_cfg.h"
|
||||||
|
|
||||||
|
#define PORT 1338
|
||||||
|
|
||||||
|
#define TYPE_READ8 0
|
||||||
|
#define TYPE_READ16 1
|
||||||
|
#define TYPE_READ32 2
|
||||||
|
#define TYPE_WRITE8 3
|
||||||
|
#define TYPE_WRITE16 4
|
||||||
|
#define TYPE_WRITE32 5
|
||||||
|
|
||||||
|
struct request {
|
||||||
|
uint32_t addr;
|
||||||
|
uint32_t value;
|
||||||
|
uint8_t type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct response {
|
||||||
|
uint32_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CONFIG_FILE_PATH "/etc/xburst-tools/usbboot.cfg"
|
||||||
|
|
||||||
|
struct ingenic_dev ingenic_dev;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int s, t;
|
||||||
|
unsigned int sinlen;
|
||||||
|
struct sockaddr_in sin;
|
||||||
|
struct request request;
|
||||||
|
struct response response;
|
||||||
|
char *cfgpath = CONFIG_FILE_PATH;
|
||||||
|
|
||||||
|
if (usb_ingenic_init(&ingenic_dev))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
if (parse_configure(&ingenic_dev.config, cfgpath))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
boot(&ingenic_dev, STAGE1_FILE_PATH, STAGE2_FILE_PATH);
|
||||||
|
|
||||||
|
if ( (s = socket(AF_INET, SOCK_STREAM, 0 ) ) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sin.sin_family = AF_INET; /*set protocol family to Internet */
|
||||||
|
sin.sin_port = htons(PORT); /* set port no. */
|
||||||
|
sin.sin_addr.s_addr = INADDR_ANY; /* set IP addr to any interface */
|
||||||
|
|
||||||
|
if (bind(s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ){
|
||||||
|
perror("bind"); return -1; /* bind error */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* server indicates it's ready, max. listen queue is 5 */
|
||||||
|
if (listen(s, 5)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sinlen = sizeof(sin);
|
||||||
|
if ( (t = accept(s, (struct sockaddr *) &sin, &sinlen) ) < 0 ){
|
||||||
|
perror("accept "); /* accpet error */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
|
||||||
|
if (recv(t, (char*)&request, sizeof(request), 0) < 0) {
|
||||||
|
perror("recv");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* printf("Got request %x %x %x\n", request.type, request.addr,
|
||||||
|
request.value);*/
|
||||||
|
|
||||||
|
switch (request.type) {
|
||||||
|
case TYPE_READ8:
|
||||||
|
response.value = mem_read8(&ingenic_dev, request.addr);
|
||||||
|
break;
|
||||||
|
case TYPE_READ16:
|
||||||
|
response.value = mem_read16(&ingenic_dev, request.addr);
|
||||||
|
break;
|
||||||
|
case TYPE_READ32:
|
||||||
|
response.value = mem_read32(&ingenic_dev, request.addr);
|
||||||
|
break;
|
||||||
|
case TYPE_WRITE8:
|
||||||
|
mem_write8(&ingenic_dev, request.addr, request.value);
|
||||||
|
break;
|
||||||
|
case TYPE_WRITE16:
|
||||||
|
mem_write16(&ingenic_dev, request.addr, request.value);
|
||||||
|
break;
|
||||||
|
case TYPE_WRITE32:
|
||||||
|
mem_write32(&ingenic_dev, request.addr, request.value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* printf("Got response %x\n", response.value);*/
|
||||||
|
|
||||||
|
if (send(t, (char*)&response, sizeof(response),0 ) < 0 ) {
|
||||||
|
perror("send");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(t);
|
||||||
|
close(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user