📄 usb_shell_write_utility.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include "libusb/usb.h"
#include "usb_base.h"
#include "usb_shell.h"
int w1(int argc, char *argv[])
{
unsigned int addr;
unsigned char value;
unsigned int cmd_code = USB_CMD_WRITE_W1;
if(argc < 2)
{
printf("Usage: w1 [32-bit HEX addr] 8-bit_value\n");
printf("Notice: write a non-legal address will cause system fail !!\n");
return -1;
}
sscanf(argv[0], "%x", &addr);
sscanf(argv[1], "%x", &value);
/* ---------- BEGIN USB Conversation ---------- */
usb_cmd_t usb_cmd = {0};
usb_cmd.usb_command = cmd_code;
usb_cmd.usb_parameter[0] = addr;
usb_cmd.usb_parameter[1] = value;
usb_cmd.usb_seq_num = G_usb_seq_num;
if(bulk_write(G_usb_dev, &usb_cmd, sizeof(usb_cmd)) < 0)
{
printf("Write error\n");
return -1;
}
else
{
return usb_read_ack(cmd_code, G_usb_seq_num);
}
}
int w2(int argc, char *argv[])
{
unsigned int addr;
unsigned short value;
unsigned int cmd_code = USB_CMD_WRITE_W2;
if(argc < 2)
{
printf("Usage: w2 [32-bit HEX addr] 16-bit_value\n");
printf("Notice: write a non-legal address will cause system fail !!\n");
return -1;
}
sscanf(argv[0], "%x", &addr);
sscanf(argv[1], "%x", &value);
addr = addr & (~1); // mask LSB-1bit to avoid memory mis-alignment
/* ---------- BEGIN USB Conversation ---------- */
usb_cmd_t usb_cmd;
memset(&usb_cmd, 0, sizeof(usb_cmd));
usb_cmd.usb_command = cmd_code;
usb_cmd.usb_parameter[0] = addr;
usb_cmd.usb_parameter[1] = value;
usb_cmd.usb_seq_num = G_usb_seq_num;
if(bulk_write(G_usb_dev, &usb_cmd, sizeof(usb_cmd)) < 0)
{
printf("Write error\n");
return -1;
}
else
{
return usb_read_ack(cmd_code, G_usb_seq_num);
}
}
int w4(int argc, char *argv[])
{
unsigned int addr;
unsigned int value;
unsigned int cmd_code = USB_CMD_WRITE_W4;
if(argc < 2)
{
printf("Usage: w4 [32-bit HEX addr] 32-bit_value\n");
printf("Notice: write a non-legal address will cause system fail !!\n");
return -1;
}
sscanf(argv[0], "%x", &addr);
sscanf(argv[1], "%x", &value);
addr = addr & (~3); // mask LSB-2bits to avoid memory mis-alignment
/* ---------- BEGIN USB Conversation ---------- */
usb_cmd_t usb_cmd = {0};
usb_cmd.usb_command = cmd_code;
usb_cmd.usb_parameter[0] = addr;
usb_cmd.usb_parameter[1] = value;
usb_cmd.usb_seq_num = G_usb_seq_num;
if(bulk_write(G_usb_dev, &usb_cmd, sizeof(usb_cmd)) < 0)
{
printf("Write error\n");
return -1;
}
else
{
return usb_read_ack(cmd_code, G_usb_seq_num);
}
}
int wr(int argc, char *argv[])
{
unsigned int addr;
unsigned int cmd_code = USB_CMD_WRITE_RANGE;
char *filename = NULL;
int fd, length;
if(argc < 2)
{
printf("Usage: wr [32-bit HEX addr] [filename to write]\n");
return -1;
}
sscanf(argv[0], "%x", &addr);
filename = argv[1];
// Check whether the image file exists...
fd = open(filename, O_RDONLY | O_BINARY);
if(fd < 0)
{
printf("Open image file error !!\n");
return -1;
}
length = filelength(fd);
printf("File size=%d\n", length);
/* ---------- BEGIN USB Conversation ---------- */
usb_cmd_t usb_cmd = {0};
usb_cmd.usb_command = cmd_code;
usb_cmd.usb_parameter[0] = addr;
usb_cmd.usb_parameter[1] = length;
usb_cmd.usb_seq_num = G_usb_seq_num;
if(bulk_write(G_usb_dev, &usb_cmd, sizeof(usb_cmd)) < 0)
{
printf("Write error\n");
close(fd);
return -1;
}
else
{
unsigned char *buf = new unsigned char[length];
read(fd, buf, length);
close(fd);
// PC -> ARM
bulk_write(G_usb_dev, buf, length);
// ACK phase
return usb_read_ack(cmd_code, G_usb_seq_num);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -