24
24
#include "arduino_openamp.h"
25
25
#include "stm32h7xx_hal.h"
26
26
#include "ringbuffer.h"
27
+ #include "stm32h7xx_ll_rcc.h"
28
+ #include "debug.h"
27
29
28
30
/**************************************************************************************
29
31
* TYPEDEF
30
32
**************************************************************************************/
31
33
32
34
enum endpoints_t {
33
35
ENDPOINT_RAW = 0 ,
34
- ENDPOINT_RESPONSE
36
+ ENDPOINT_RPC
35
37
};
36
38
37
39
/**************************************************************************************
@@ -48,50 +50,49 @@ extern ring_buffer_t virtual_uart_ring_buffer;
48
50
int rpmsg_recv_raw_callback (struct rpmsg_endpoint * ept , void * data ,
49
51
size_t len , uint32_t src , void * priv )
50
52
{
51
- /*
52
- printf("raw: received %d bytes from M4, content:", len);
53
- for (int i = 0; i<len; i++) {
54
- printf("%x ", ((uint8_t*)data)[i]);
55
- }
56
- printf("\n");
57
- */
58
53
ring_buffer_queue_arr (& virtual_uart_ring_buffer , (const char * )data , len );
59
54
60
55
return 0 ;
61
56
}
62
57
63
58
void new_service_cb (struct rpmsg_device * rdev , const char * name , uint32_t dest )
64
59
{
65
- if ( strcmp ( name , "raw" ) == 0 ) {
66
- OPENAMP_create_endpoint ( & rp_endpoints [ ENDPOINT_RAW ], name , dest , rpmsg_recv_raw_callback , NULL ) ;
67
- }
60
+ uint8_t buffer [ 1 ] = { 0 };
61
+ struct rpmsg_endpoint * ept = NULL ;
62
+
68
63
if (strcmp (name , "rpc" ) == 0 ) {
69
- OPENAMP_create_endpoint (& rp_endpoints [ENDPOINT_RESPONSE ], name , dest , rpmsg_recv_raw_callback , NULL );
64
+ ept = & rp_endpoints [ENDPOINT_RPC ];
65
+ } else if (strcmp (name , "raw" ) == 0 ) {
66
+ ept = & rp_endpoints [ENDPOINT_RAW ];
67
+ }
68
+
69
+ if (ept ) {
70
+ OPENAMP_create_endpoint (ept , name , dest , rpmsg_recv_raw_callback , NULL );
71
+ OPENAMP_send (ept , buffer , sizeof (buffer ));
70
72
}
71
73
}
72
74
73
75
int serial_rpc_begin () {
74
76
75
77
/* Initialize OpenAmp and libmetal libraries */
76
- if (MX_OPENAMP_Init (RPMSG_MASTER , new_service_cb ) != HAL_OK ) {
78
+ if (MX_OPENAMP_Init (RPMSG_HOST , new_service_cb ) != HAL_OK ) {
77
79
return 0 ;
78
80
}
79
81
80
82
/* Initialize the rpmsg endpoint to set default addresses to RPMSG_ADDR_ANY */
81
- rpmsg_init_ept (& rp_endpoints [0 ], "raw" , RPMSG_ADDR_ANY , RPMSG_ADDR_ANY , NULL , NULL );
82
- rpmsg_init_ept (& rp_endpoints [1 ], "rpc" , RPMSG_ADDR_ANY , RPMSG_ADDR_ANY , NULL , NULL );
83
+ memset (rp_endpoints , 0 , sizeof (rp_endpoints ));
83
84
84
85
/*
85
86
* The rpmsg service is initiate by the remote processor, on H7 new_service_cb
86
87
* callback is received on service creation. Wait for the callback
87
88
*/
88
- OPENAMP_Wait_EndPointready ( & rp_endpoints [ 0 ], HAL_GetTick () + 500 );
89
- OPENAMP_Wait_EndPointready ( & rp_endpoints [1 ], HAL_GetTick () + 500 );
90
-
91
- // Send first dummy message to enable the channel
92
- int message = 0x00 ;
93
- OPENAMP_send ( & rp_endpoints [ 0 ], & message , sizeof ( message ));
94
- OPENAMP_send ( & rp_endpoints [ 1 ], & message , sizeof ( message ));
89
+ uint32_t millis_start = HAL_GetTick ( );
90
+ while ( rp_endpoints [0 ]. rdev == NULL || rp_endpoints [ 1 ]. rdev == NULL ) {
91
+ if (( HAL_GetTick () - millis_start ) >= 1000 ) {
92
+ dbg_printf ( "M4 RPC timeout\n" );
93
+ return 0 ;
94
+ }
95
+ }
95
96
96
97
return 1 ;
97
98
}
@@ -102,7 +103,7 @@ void serial_rpc_available() {
102
103
103
104
void serial_rpc_write (uint8_t const * buf , size_t len ) {
104
105
// we'll only get rpc requests from "upstairs"
105
- OPENAMP_send (& rp_endpoints [1 ], buf , len );
106
+ OPENAMP_send (& rp_endpoints [ENDPOINT_RPC ], buf , len );
106
107
}
107
108
108
109
void HSEM1_IRQHandler (void )
0 commit comments