Fix up linker script; improve startup code; printf to USB.
This commit is contained in:
parent
d2755ec538
commit
4a175e1f11
|
@ -97,7 +97,7 @@ typedef struct _CDC_IF_PROP
|
||||||
uint16_t (*pIf_Init) (void);
|
uint16_t (*pIf_Init) (void);
|
||||||
uint16_t (*pIf_DeInit) (void);
|
uint16_t (*pIf_DeInit) (void);
|
||||||
uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len);
|
uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len);
|
||||||
uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len);
|
uint16_t (*pIf_DataTx) (const uint8_t* Buf, uint32_t Len);
|
||||||
uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len);
|
uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len);
|
||||||
}
|
}
|
||||||
CDC_IF_Prop_TypeDef;
|
CDC_IF_Prop_TypeDef;
|
||||||
|
|
|
@ -60,7 +60,7 @@ extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to
|
||||||
static uint16_t VCP_Init (void);
|
static uint16_t VCP_Init (void);
|
||||||
static uint16_t VCP_DeInit (void);
|
static uint16_t VCP_DeInit (void);
|
||||||
static uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len);
|
static uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len);
|
||||||
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len);
|
static uint16_t VCP_DataTx (const uint8_t* Buf, uint32_t Len);
|
||||||
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len);
|
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len);
|
||||||
|
|
||||||
CDC_IF_Prop_TypeDef VCP_fops =
|
CDC_IF_Prop_TypeDef VCP_fops =
|
||||||
|
@ -181,7 +181,7 @@ static uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len)
|
||||||
* @param Len: Number of data to be sent (in bytes)
|
* @param Len: Number of data to be sent (in bytes)
|
||||||
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
||||||
*/
|
*/
|
||||||
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
|
static uint16_t VCP_DataTx (const uint8_t* Buf, uint32_t Len)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < Len; i++) {
|
for (int i = 0; i < Len; i++) {
|
||||||
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
|
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
|
||||||
|
@ -212,7 +212,7 @@ static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
|
||||||
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
||||||
*/
|
*/
|
||||||
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len) {
|
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len) {
|
||||||
printf("%.*s", (int)Len, Buf);
|
//printf("%.*s", (int)Len, Buf);
|
||||||
return USBD_OK;
|
return USBD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,4 @@
|
||||||
#define MSC_MAX_PACKET 64
|
#define MSC_MAX_PACKET 64
|
||||||
#define MSC_MEDIA_PACKET 4096
|
#define MSC_MEDIA_PACKET 4096
|
||||||
|
|
||||||
// for both?
|
|
||||||
#define APP_FOPS VCP_fops
|
|
||||||
|
|
||||||
#endif //__USBD_CONF__H__
|
#endif //__USBD_CONF__H__
|
||||||
|
|
|
@ -96,7 +96,7 @@ static uint8_t *usbd_pyb_GetCfgDesc (uint8_t speed, uint16_t *length);
|
||||||
/** @defgroup usbd_cdc_Private_Variables
|
/** @defgroup usbd_cdc_Private_Variables
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
extern CDC_IF_Prop_TypeDef APP_FOPS;
|
extern CDC_IF_Prop_TypeDef VCP_fops;
|
||||||
extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC];
|
extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC];
|
||||||
|
|
||||||
__ALIGN_BEGIN static uint8_t usbd_cdc_AltSet __ALIGN_END = 0;
|
__ALIGN_BEGIN static uint8_t usbd_cdc_AltSet __ALIGN_END = 0;
|
||||||
|
@ -322,7 +322,7 @@ static uint8_t usbd_pyb_Init(void *pdev, uint8_t cfgidx) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Initialize the Interface physical components
|
// Initialize the Interface physical components
|
||||||
APP_FOPS.pIf_Init();
|
VCP_fops.pIf_Init();
|
||||||
|
|
||||||
// Prepare Out endpoint to receive next packet */
|
// Prepare Out endpoint to receive next packet */
|
||||||
DCD_EP_PrepareRx(pdev,
|
DCD_EP_PrepareRx(pdev,
|
||||||
|
@ -367,7 +367,7 @@ static uint8_t usbd_pyb_DeInit(void *pdev, uint8_t cfgidx) {
|
||||||
DCD_EP_Close(pdev, CDC_CMD_EP);
|
DCD_EP_Close(pdev, CDC_CMD_EP);
|
||||||
|
|
||||||
// Restore default state of the Interface physical components
|
// Restore default state of the Interface physical components
|
||||||
APP_FOPS.pIf_DeInit();
|
VCP_fops.pIf_DeInit();
|
||||||
|
|
||||||
//----------------------------------
|
//----------------------------------
|
||||||
// MSC component
|
// MSC component
|
||||||
|
@ -475,7 +475,7 @@ static uint8_t usbd_pyb_Setup(void *pdev, USB_SETUP_REQ *req) {
|
||||||
// Device-to-Host request
|
// Device-to-Host request
|
||||||
|
|
||||||
// Get the data to be sent to Host from interface layer
|
// Get the data to be sent to Host from interface layer
|
||||||
APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength);
|
VCP_fops.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength);
|
||||||
|
|
||||||
// Send the data to the host
|
// Send the data to the host
|
||||||
return USBD_CtlSendData(pdev, CmdBuff, req->wLength);
|
return USBD_CtlSendData(pdev, CmdBuff, req->wLength);
|
||||||
|
@ -495,7 +495,7 @@ static uint8_t usbd_pyb_Setup(void *pdev, USB_SETUP_REQ *req) {
|
||||||
// Not a Data request
|
// Not a Data request
|
||||||
|
|
||||||
// Transfer the command to the interface layer */
|
// Transfer the command to the interface layer */
|
||||||
return APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0);
|
return VCP_fops.pIf_Ctrl(req->bRequest, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (req->wIndex == 2) {
|
} else if (req->wIndex == 2) {
|
||||||
|
@ -537,7 +537,7 @@ static uint8_t usbd_pyb_Setup(void *pdev, USB_SETUP_REQ *req) {
|
||||||
static uint8_t usbd_pyb_EP0_RxReady(void *pdev) {
|
static uint8_t usbd_pyb_EP0_RxReady(void *pdev) {
|
||||||
if (cdcCmd != NO_CMD) {
|
if (cdcCmd != NO_CMD) {
|
||||||
// Process the data
|
// Process the data
|
||||||
APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen);
|
VCP_fops.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen);
|
||||||
|
|
||||||
// Reset the command variable to default value
|
// Reset the command variable to default value
|
||||||
cdcCmd = NO_CMD;
|
cdcCmd = NO_CMD;
|
||||||
|
@ -612,7 +612,7 @@ static uint8_t usbd_pyb_DataOut(void *pdev, uint8_t epnum) {
|
||||||
|
|
||||||
/* USB data will be immediately processed, this allow next USB traffic being
|
/* USB data will be immediately processed, this allow next USB traffic being
|
||||||
NAKed till the end of the application Xfer */
|
NAKed till the end of the application Xfer */
|
||||||
APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);
|
VCP_fops.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);
|
||||||
|
|
||||||
// Prepare Out endpoint to receive next packet */
|
// Prepare Out endpoint to receive next packet */
|
||||||
DCD_EP_PrepareRx(pdev,
|
DCD_EP_PrepareRx(pdev,
|
||||||
|
|
142
stm/main.c
142
stm/main.c
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
void delay_ms(int ms);
|
void delay_ms(int ms);
|
||||||
|
|
||||||
void impl02_c_version() {
|
static void impl02_c_version() {
|
||||||
int x = 0;
|
int x = 0;
|
||||||
while (x < 400) {
|
while (x < 400) {
|
||||||
int y = 0;
|
int y = 0;
|
||||||
|
@ -52,7 +52,7 @@ void gpio_pin_af(GPIO_TypeDef *gpio, uint32_t pin, uint32_t af) {
|
||||||
set_bits(&gpio->AFR[pin >> 3], 4 * (pin & 0x07), 0xf, af);
|
set_bits(&gpio->AFR[pin >> 3], 4 * (pin & 0x07), 0xf, af);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mma_init() {
|
static void mma_init() {
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // enable I2C1
|
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // enable I2C1
|
||||||
gpio_pin_init(GPIOB, 6 /* B6 is SCL */, 2 /* AF mode */, 1 /* open drain output */, 1 /* 25 MHz */, 0 /* no pull up or pull down */);
|
gpio_pin_init(GPIOB, 6 /* B6 is SCL */, 2 /* AF mode */, 1 /* open drain output */, 1 /* 25 MHz */, 0 /* no pull up or pull down */);
|
||||||
gpio_pin_init(GPIOB, 7 /* B7 is SDA */, 2 /* AF mode */, 1 /* open drain output */, 1 /* 25 MHz */, 0 /* no pull up or pull down */);
|
gpio_pin_init(GPIOB, 7 /* B7 is SDA */, 2 /* AF mode */, 1 /* open drain output */, 1 /* 25 MHz */, 0 /* no pull up or pull down */);
|
||||||
|
@ -82,14 +82,14 @@ void mma_init() {
|
||||||
// set START bit in CR1 to generate a start cond!
|
// set START bit in CR1 to generate a start cond!
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t i2c_get_sr() {
|
static uint32_t i2c_get_sr() {
|
||||||
// must read SR1 first, then SR2, as the read can clear some flags
|
// must read SR1 first, then SR2, as the read can clear some flags
|
||||||
uint32_t sr1 = I2C1->SR1;
|
uint32_t sr1 = I2C1->SR1;
|
||||||
uint32_t sr2 = I2C1->SR2;
|
uint32_t sr2 = I2C1->SR2;
|
||||||
return (sr2 << 16) | sr1;
|
return (sr2 << 16) | sr1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mma_restart(uint8_t addr, int write) {
|
static void mma_restart(uint8_t addr, int write) {
|
||||||
// send start condition
|
// send start condition
|
||||||
I2C1->CR1 |= I2C_CR1_START;
|
I2C1->CR1 |= I2C_CR1_START;
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ void mma_restart(uint8_t addr, int write) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mma_start(uint8_t addr, int write) {
|
static void mma_start(uint8_t addr, int write) {
|
||||||
// wait until I2C is not busy
|
// wait until I2C is not busy
|
||||||
while (I2C1->SR2 & I2C_SR2_BUSY) {
|
while (I2C1->SR2 & I2C_SR2_BUSY) {
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ void mma_start(uint8_t addr, int write) {
|
||||||
mma_restart(addr, write);
|
mma_restart(addr, write);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mma_send_byte(uint8_t data) {
|
static void mma_send_byte(uint8_t data) {
|
||||||
// send byte
|
// send byte
|
||||||
I2C1->DR = data;
|
I2C1->DR = data;
|
||||||
// wait for TRA, BUSY, MSL, TXE and BTF (byte transmitted)
|
// wait for TRA, BUSY, MSL, TXE and BTF (byte transmitted)
|
||||||
|
@ -134,7 +134,7 @@ void mma_send_byte(uint8_t data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t mma_read_ack() {
|
static uint8_t mma_read_ack() {
|
||||||
// enable ACK of received byte
|
// enable ACK of received byte
|
||||||
I2C1->CR1 |= I2C_CR1_ACK;
|
I2C1->CR1 |= I2C_CR1_ACK;
|
||||||
// wait for BUSY, MSL and RXNE (byte received)
|
// wait for BUSY, MSL and RXNE (byte received)
|
||||||
|
@ -145,7 +145,7 @@ uint8_t mma_read_ack() {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t mma_read_nack() {
|
static uint8_t mma_read_nack() {
|
||||||
// disable ACK of received byte (to indicate end of receiving)
|
// disable ACK of received byte (to indicate end of receiving)
|
||||||
I2C1->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ACK);
|
I2C1->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ACK);
|
||||||
// last byte should apparently also generate a stop condition
|
// last byte should apparently also generate a stop condition
|
||||||
|
@ -158,7 +158,7 @@ uint8_t mma_read_nack() {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mma_stop() {
|
static void mma_stop() {
|
||||||
// send stop condition
|
// send stop condition
|
||||||
I2C1->CR1 |= I2C_CR1_STOP;
|
I2C1->CR1 |= I2C_CR1_STOP;
|
||||||
}
|
}
|
||||||
|
@ -440,6 +440,8 @@ py_obj_t pyb_sw() {
|
||||||
FATFS fatfs0;
|
FATFS fatfs0;
|
||||||
|
|
||||||
#include "nlr.h"
|
#include "nlr.h"
|
||||||
|
|
||||||
|
/*
|
||||||
void g(uint i) {
|
void g(uint i) {
|
||||||
printf("g:%d\n", i);
|
printf("g:%d\n", i);
|
||||||
if (i & 1) {
|
if (i & 1) {
|
||||||
|
@ -467,8 +469,13 @@ void f() {
|
||||||
void nlr_test() {
|
void nlr_test() {
|
||||||
f(1);
|
f(1);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
int dummy_bss;
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
int dummy;
|
||||||
|
|
||||||
// should disable JTAG
|
// should disable JTAG
|
||||||
|
|
||||||
qstr_init();
|
qstr_init();
|
||||||
|
@ -486,12 +493,13 @@ int main() {
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
led_state(PYB_LEDR1_PORT_NUM, 1);
|
led_state(PYB_LEDR1_PORT_NUM, 1);
|
||||||
led_state(PYB_LEDR2_PORT_NUM, 0);
|
led_state(PYB_LEDR2_PORT_NUM, 0);
|
||||||
delay_ms(200);
|
delay_ms(100);
|
||||||
led_state(PYB_LEDR1_PORT_NUM, 0);
|
led_state(PYB_LEDR1_PORT_NUM, 0);
|
||||||
led_state(PYB_LEDR2_PORT_NUM, 1);
|
led_state(PYB_LEDR2_PORT_NUM, 1);
|
||||||
delay_ms(200);
|
delay_ms(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// turn LEDs off
|
||||||
led_state(PYB_LEDR1_PORT_NUM, 0);
|
led_state(PYB_LEDR1_PORT_NUM, 0);
|
||||||
led_state(PYB_LEDR2_PORT_NUM, 0);
|
led_state(PYB_LEDR2_PORT_NUM, 0);
|
||||||
led_state(PYB_LEDG1_PORT_NUM, 0);
|
led_state(PYB_LEDG1_PORT_NUM, 0);
|
||||||
|
@ -508,30 +516,48 @@ int main() {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
// USB
|
||||||
extern int _sidata;
|
if (1) {
|
||||||
extern int _sdata;
|
void usb_init();
|
||||||
extern int _edata;
|
usb_init();
|
||||||
extern int _sbss;
|
}
|
||||||
extern int _ebss;
|
|
||||||
delay_ms(2000);
|
for (;;) {
|
||||||
printf("_sidata=%04x\n", _sidata);
|
led_state(PYB_LEDG1_PORT_NUM, 1);
|
||||||
printf("_sdata=%04x\n", _sdata);
|
delay_ms(100);
|
||||||
printf("_edata=%04x\n", _edata);
|
led_state(PYB_LEDG1_PORT_NUM, 0);
|
||||||
printf("_sbss=%04x\n", _sbss);
|
extern void *_sidata;
|
||||||
printf("_ebss=%04x\n", _ebss);
|
extern void *_sdata;
|
||||||
//printf("sizeof(int)=%d\n", sizeof(int)); // 4
|
extern void *_edata;
|
||||||
delay_ms(2000);
|
extern void *_sbss;
|
||||||
*/
|
extern void *_ebss;
|
||||||
|
extern void *_estack;
|
||||||
|
extern void *_etext;
|
||||||
|
extern void *_heap_start;
|
||||||
|
if (sw_get()) {
|
||||||
|
printf("_sidata=%p\n", &_sidata);
|
||||||
|
printf("_sdata=%p\n", &_sdata);
|
||||||
|
printf("_edata=%p\n", &_edata);
|
||||||
|
printf("_sbss=%p\n", &_sbss);
|
||||||
|
printf("_ebss=%p\n", &_ebss);
|
||||||
|
printf("_estack=%p\n", &_estack);
|
||||||
|
printf("_etext=%p\n", &_etext);
|
||||||
|
printf("_heap_start=%p\n", &_heap_start);
|
||||||
|
printf("&dummy=%p\n", &dummy);
|
||||||
|
printf("&dummy_bss=%p\n", &dummy_bss);
|
||||||
|
printf("dummy_bss=%x\n", dummy_bss);
|
||||||
|
//printf("sizeof(int)=%d\n", sizeof(int)); // 4
|
||||||
|
delay_ms(1000);
|
||||||
|
}
|
||||||
|
delay_ms(500);
|
||||||
|
}
|
||||||
|
|
||||||
//printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init
|
//printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init
|
||||||
//delay_ms(1000);
|
//delay_ms(1000);
|
||||||
|
|
||||||
nlr_test();
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
// Python!
|
// Python!
|
||||||
if (1) {
|
if (0) {
|
||||||
//const char *pysrc = "def f():\n x=x+1\nprint(42)\n";
|
//const char *pysrc = "def f():\n x=x+1\nprint(42)\n";
|
||||||
const char *pysrc =
|
const char *pysrc =
|
||||||
// impl01.py
|
// impl01.py
|
||||||
|
@ -802,12 +828,6 @@ int main() {
|
||||||
//usb_vcp_init();
|
//usb_vcp_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
// USB testing
|
|
||||||
if (0) {
|
|
||||||
void usb_init();
|
|
||||||
usb_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
|
@ -833,55 +853,3 @@ int main() {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void testf() {
|
|
||||||
testf(1, 2, 3);
|
|
||||||
testf(1, 2, 3, 4);
|
|
||||||
testf(1, 2, 3, 4, 5);
|
|
||||||
testf(1, 2, 3, 4, 5, 6);
|
|
||||||
testf(1, 2, 3, 4, 5, 6, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
int testg(int a, int b, int c, int d, int e) {
|
|
||||||
return a + b + c + d + testh(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
int testh(int x, byte *y) {
|
|
||||||
return x + (y[-2] << 2);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
void print_int(int x, int y, int z, int zz) {
|
|
||||||
printf("I %x %x %x %x", x, y, z, zz);
|
|
||||||
byte* ptr = (byte*)z;
|
|
||||||
printf("\nP %02x %02x %02x %02x", ptr[-4], ptr[-3], ptr[-2], ptr[-1]);
|
|
||||||
for (;;) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void print_int_0(int x) { printf("P0 %x", x); }
|
|
||||||
void print_int_1(int x) { printf("P1 %x", x); }
|
|
||||||
void print_int_2(int x) { printf("P2 %x", x); }
|
|
||||||
void print_int_3(int x) { printf("P3 %x", x); }
|
|
||||||
void print_int_4(int x) { printf("P4 %x", x); }
|
|
||||||
|
|
||||||
typedef struct _b_t {
|
|
||||||
void (*m1)(void*, int);
|
|
||||||
void (*m2)(void*, int);
|
|
||||||
} b_t;
|
|
||||||
typedef struct _a_t {
|
|
||||||
b_t *b;
|
|
||||||
} a_t;
|
|
||||||
void b_m1(b_t*, int);
|
|
||||||
void b_m2(b_t*, int);
|
|
||||||
void f1(a_t *a) {
|
|
||||||
a->b->m1(a->b, 2);
|
|
||||||
a->b->m2(a->b, 4);
|
|
||||||
b_m1(a->b, 2);
|
|
||||||
b_m2(a->b, 4);
|
|
||||||
}
|
|
||||||
void b_m1(b_t *b, int x) {
|
|
||||||
b->m1(b, x);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
|
@ -5,7 +5,8 @@ static uint32_t mem = 0;
|
||||||
|
|
||||||
void *malloc(size_t n) {
|
void *malloc(size_t n) {
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
mem = 0x20008000; // need to use big ram block so we can execute code from it; start up a bit in case that's where bss is...?
|
extern uint32_t _heap_start;
|
||||||
|
mem = &_heap_start; // need to use big ram block so we can execute code from it (is it true that we can't execute from CCM?)
|
||||||
}
|
}
|
||||||
void *ptr = (void*)mem;
|
void *ptr = (void*)mem;
|
||||||
mem = (mem + n + 3) & (~3);
|
mem = (mem + n + 3) & (~3);
|
||||||
|
|
16
stm/printf.c
16
stm/printf.c
|
@ -209,17 +209,17 @@ int pfenv_printf(pfenv_t *pfenv, const char *fmt, va_list args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_print_strn(const char *str, unsigned int len);
|
void lcd_print_strn(const char *str, unsigned int len);
|
||||||
|
void usb_vcp_send(const char* str, int len);
|
||||||
|
|
||||||
void xxx(void *data, const char *str, unsigned int len) {
|
void stdout_print_strn(void *data, const char *str, unsigned int len) {
|
||||||
|
// send stdout to LCD and USB CDC VCP
|
||||||
lcd_print_strn(str, len);
|
lcd_print_strn(str, len);
|
||||||
|
usb_vcp_send(str, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
pfenv_t pfenv_stdout = {0, xxx};
|
pfenv_t pfenv_stdout = {0, stdout_print_strn};
|
||||||
|
|
||||||
int printf(const char *fmt, ...) {
|
int printf(const char *fmt, ...) {
|
||||||
//pfenv_t pfenv;
|
|
||||||
//pfenv.data = 0;
|
|
||||||
//pfenv.print_strn = xxx;
|
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
return pfenv_printf(&pfenv_stdout, fmt, args);
|
return pfenv_printf(&pfenv_stdout, fmt, args);
|
||||||
|
@ -228,15 +228,15 @@ int printf(const char *fmt, ...) {
|
||||||
// need this because gcc optimises printf("%c", c) -> putchar(c), and printf("a") -> putchar('a')
|
// need this because gcc optimises printf("%c", c) -> putchar(c), and printf("a") -> putchar('a')
|
||||||
int putchar(int c) {
|
int putchar(int c) {
|
||||||
char chr = c;
|
char chr = c;
|
||||||
xxx(0, &chr, 1);
|
stdout_print_strn(0, &chr, 1);
|
||||||
return chr;
|
return chr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// need this because gcc optimises printf("string\n") -> puts("string")
|
// need this because gcc optimises printf("string\n") -> puts("string")
|
||||||
int puts(const char *s) {
|
int puts(const char *s) {
|
||||||
xxx(0, s, strlen(s));
|
stdout_print_strn(0, s, strlen(s));
|
||||||
char chr = '\n';
|
char chr = '\n';
|
||||||
xxx(0, &chr, 1);
|
stdout_print_strn(0, &chr, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,7 @@ defined in linker script */
|
||||||
Reset_Handler:
|
Reset_Handler:
|
||||||
|
|
||||||
/* Copy the data segment initializers from flash to SRAM */
|
/* Copy the data segment initializers from flash to SRAM */
|
||||||
|
/*
|
||||||
movs r1, #0
|
movs r1, #0
|
||||||
b LoopCopyDataInit
|
b LoopCopyDataInit
|
||||||
|
|
||||||
|
@ -87,9 +88,23 @@ LoopCopyDataInit:
|
||||||
adds r2, r0, r1
|
adds r2, r0, r1
|
||||||
cmp r2, r3
|
cmp r2, r3
|
||||||
bcc CopyDataInit
|
bcc CopyDataInit
|
||||||
|
*/
|
||||||
|
ldr r0, =_sidata @ source pointer
|
||||||
|
ldr r1, =_sdata @ destination pointer
|
||||||
|
ldr r2, =_edata @ maximum destination pointer
|
||||||
|
b data_init_entry
|
||||||
|
data_init_loop:
|
||||||
|
ldr r3, [r0], #4
|
||||||
|
str r3, [r1], #4
|
||||||
|
data_init_entry:
|
||||||
|
cmp r1, r2
|
||||||
|
bcc data_init_loop
|
||||||
|
|
||||||
|
|
||||||
|
/* Zero fill the bss segment. */
|
||||||
|
/*
|
||||||
ldr r2, =_sbss
|
ldr r2, =_sbss
|
||||||
b LoopFillZerobss
|
b LoopFillZerobss
|
||||||
/* Zero fill the bss segment. */
|
|
||||||
FillZerobss:
|
FillZerobss:
|
||||||
movs r3, #0
|
movs r3, #0
|
||||||
str r3, [r2], #4
|
str r3, [r2], #4
|
||||||
|
@ -98,6 +113,17 @@ LoopFillZerobss:
|
||||||
ldr r3, = _ebss
|
ldr r3, = _ebss
|
||||||
cmp r2, r3
|
cmp r2, r3
|
||||||
bcc FillZerobss
|
bcc FillZerobss
|
||||||
|
*/
|
||||||
|
|
||||||
|
movs r0, #0 @ source value
|
||||||
|
ldr r1, =_sbss @ destination pointer
|
||||||
|
ldr r2, =_ebss @ maximum destination pointer
|
||||||
|
b bss_init_entry
|
||||||
|
bss_init_loop:
|
||||||
|
str r0, [r1], #4
|
||||||
|
bss_init_entry:
|
||||||
|
cmp r1, r2
|
||||||
|
bcc bss_init_loop
|
||||||
|
|
||||||
/* Call the clock system intitialization function.*/
|
/* Call the clock system intitialization function.*/
|
||||||
bl SystemInit
|
bl SystemInit
|
||||||
|
|
|
@ -2,27 +2,22 @@
|
||||||
GNU linker script for STM32F405
|
GNU linker script for STM32F405
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Entry Point */
|
|
||||||
ENTRY(Reset_Handler)
|
|
||||||
|
|
||||||
/* Specify the memory areas */
|
/* Specify the memory areas */
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x100000 /* 1 MiB */
|
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x100000 /* 1 MiB */
|
||||||
RAM_CCM (xrw) : ORIGIN = 0x10000000, LENGTH = 0x010000 /* 64 KiB */
|
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 0x010000 /* 64 KiB */
|
||||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x020000 /* 128 KiB */
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x020000 /* 128 KiB */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* define stack size and heap size here */
|
/* produce a link error if there is not this amount of RAM for these sections */
|
||||||
stack_size = 2048;
|
_minimum_stack_size = 2K;
|
||||||
heap_size = 0x4000; /* 16KiB */
|
_minimum_heap_size = 16K;
|
||||||
|
|
||||||
/* define beginning and ending of stack */
|
/* top end of the stack */
|
||||||
_stack_start = ORIGIN(RAM) + LENGTH(RAM);
|
_estack = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
_stack_end = _stack_start - stack_size;
|
|
||||||
_estack = _stack_end;
|
/* define output sections */
|
||||||
|
|
||||||
/* Define output sections */
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
/* The startup code goes first into FLASH */
|
/* The startup code goes first into FLASH */
|
||||||
|
@ -30,6 +25,7 @@ SECTIONS
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
KEEP(*(.isr_vector)) /* Startup code */
|
KEEP(*(.isr_vector)) /* Startup code */
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} >FLASH
|
} >FLASH
|
||||||
|
|
||||||
|
@ -43,10 +39,13 @@ SECTIONS
|
||||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
||||||
/* *(.glue_7) */ /* glue arm to thumb code */
|
/* *(.glue_7) */ /* glue arm to thumb code */
|
||||||
/* *(.glue_7t) */ /* glue thumb to arm code */
|
/* *(.glue_7t) */ /* glue thumb to arm code */
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_etext = .; /* define a global symbols at end of code */
|
_etext = .; /* define a global symbol at end of code */
|
||||||
|
_sidata = _etext; /* This is used by the startup in order to initialize the .data secion */
|
||||||
} >FLASH
|
} >FLASH
|
||||||
|
|
||||||
|
/*
|
||||||
.ARM.extab :
|
.ARM.extab :
|
||||||
{
|
{
|
||||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
@ -58,51 +57,51 @@ SECTIONS
|
||||||
*(.ARM.exidx*)
|
*(.ARM.exidx*)
|
||||||
__exidx_end = .;
|
__exidx_end = .;
|
||||||
} >FLASH
|
} >FLASH
|
||||||
|
*/
|
||||||
|
|
||||||
/* used by the startup to initialize data */
|
/* This is the initialized data section
|
||||||
_sidata = .;
|
The program executes knowing that the data is in the RAM
|
||||||
|
but the loader puts the initial values in the FLASH (inidata).
|
||||||
/* Initialized data sections goes into RAM, load LMA copy after code */
|
It is one task of the startup to copy the initial values from FLASH to RAM. */
|
||||||
.data : AT ( _sidata )
|
.data : AT ( _sidata )
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_sdata = .; /* create a global symbol at data start */
|
_sdata = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
|
||||||
*(.data) /* .data sections */
|
*(.data) /* .data sections */
|
||||||
*(.data*) /* .data* sections */
|
*(.data*) /* .data* sections */
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_edata = .; /* define a global symbol at data end */
|
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
/* Uninitialized data section */
|
/* Uninitialized data section */
|
||||||
. = ALIGN(4);
|
|
||||||
.bss :
|
.bss :
|
||||||
{
|
{
|
||||||
/* Used by the startup in order to initialize the .bss secion */
|
. = ALIGN(4);
|
||||||
_sbss = .; /* define a global symbol at bss start */
|
_sbss = .; /* define a global symbol at bss start; used by startup code */
|
||||||
__bss_start__ = _sbss;
|
|
||||||
*(.bss)
|
*(.bss)
|
||||||
*(.bss*)
|
*(.bss*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_ebss = .; /* define a global symbol at bss end */
|
_ebss = .; /* define a global symbol at bss end; used by startup code */
|
||||||
__bss_end__ = _ebss;
|
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
. = ALIGN(4);
|
/* this is to define the start of the heap, and make sure we have a minimum size */
|
||||||
.heap :
|
.heap :
|
||||||
{
|
{
|
||||||
_heap_start = .;
|
. = ALIGN(4);
|
||||||
. = . + heap_size;
|
_heap_start = .; /* define a global symbol at heap start */
|
||||||
} > RAM
|
. = . + _minimum_heap_size;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
. = ALIGN(4);
|
/* this just checks there is enough RAM for the stack */
|
||||||
. = _stack_end;
|
|
||||||
.stack :
|
.stack :
|
||||||
{
|
{
|
||||||
. = . + stack_size;
|
. = ALIGN(4);
|
||||||
} > RAM
|
. = . + _minimum_stack_size;
|
||||||
|
. = ALIGN(4);
|
||||||
|
} >RAM
|
||||||
|
|
||||||
/* Remove information from the standard libraries */
|
/* Remove information from the standard libraries */
|
||||||
/*
|
/*
|
||||||
|
|
19
stm/usb.c
19
stm/usb.c
|
@ -1,21 +1,22 @@
|
||||||
#include "usb_core.h"
|
#include "usb_core.h"
|
||||||
#include "usbd_core.h"
|
#include "usbd_core.h"
|
||||||
|
#include "usbd_cdc_core.h"
|
||||||
#include "usbd_pyb_core.h"
|
#include "usbd_pyb_core.h"
|
||||||
#include "usbd_usr.h"
|
#include "usbd_usr.h"
|
||||||
#include "usbd_desc.h"
|
#include "usbd_desc.h"
|
||||||
|
|
||||||
//extern CDC_IF_Prop_TypeDef APP_FOPS;
|
extern CDC_IF_Prop_TypeDef VCP_fops;
|
||||||
|
|
||||||
|
int is_enabled = 0;
|
||||||
USB_OTG_CORE_HANDLE USB_OTG_dev;
|
USB_OTG_CORE_HANDLE USB_OTG_dev;
|
||||||
|
|
||||||
void usb_vcp_init() {
|
|
||||||
//USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
void usb_vcp_send(const char* str, int len) {
|
|
||||||
//APP_FOPS.pIf_DataTx(str, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void usb_init() {
|
void usb_init() {
|
||||||
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_cb, &USR_cb);
|
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_cb, &USR_cb);
|
||||||
|
is_enabled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usb_vcp_send(const char* str, int len) {
|
||||||
|
if (is_enabled) {
|
||||||
|
VCP_fops.pIf_DataTx((const uint8_t*)str, len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue