@@ -38,7 +38,8 @@ use smoltcp::{
38
38
time:: Instant ,
39
39
wire:: { EthernetAddress , IpAddress , IpEndpoint , Ipv4Address } ,
40
40
} ;
41
- use stm32f7:: stm32f7x6:: { CorePeripherals , Interrupt , Peripherals , SAI2 } ;
41
+ use stm32f7:: stm32f7x6:: { CorePeripherals , Interrupt , Peripherals , SAI2 , RCC , SYSCFG ,
42
+ ETHERNET_DMA , ETHERNET_MAC } ;
42
43
use stm32f7_discovery:: {
43
44
ethernet,
44
45
gpio:: { GpioPort , InputPin , OutputPin } ,
@@ -245,62 +246,7 @@ fn run() -> ! {
245
246
let idle_stream = task_runtime:: IdleStream :: new ( idle_waker_sink. clone ( ) ) ;
246
247
247
248
// ethernet
248
- let mut ethernet_task_idle_stream = task_runtime:: IdleStream :: new ( idle_waker_sink. clone ( ) ) ;
249
- let _ethernet_task = async move || {
250
- let mut ethernet_interface = ethernet:: EthernetDevice :: new (
251
- Default :: default ( ) ,
252
- Default :: default ( ) ,
253
- & mut rcc,
254
- & mut syscfg,
255
- & mut ethernet_mac,
256
- & mut ethernet_dma,
257
- ETH_ADDR ,
258
- )
259
- . map ( |device| device. into_interface ( IP_ADDR ) ) ;
260
- if let Err ( e) = ethernet_interface {
261
- println ! ( "ethernet init failed: {:?}" , e) ;
262
- } ;
263
-
264
- let mut sockets = SocketSet :: new ( Vec :: new ( ) ) ;
265
-
266
- if ethernet_interface. is_ok ( ) {
267
- let endpoint = IpEndpoint :: new ( IpAddress :: Ipv4 ( IP_ADDR ) , 15 ) ;
268
- let udp_rx_buffer = UdpSocketBuffer :: new ( vec ! [ UdpPacketMetadata :: EMPTY ; 3 ] , vec ! [ 0u8 ; 256 ] ) ;
269
- let udp_tx_buffer = UdpSocketBuffer :: new ( vec ! [ UdpPacketMetadata :: EMPTY ; 1 ] , vec ! [ 0u8 ; 128 ] ) ;
270
- let mut example_udp_socket = UdpSocket :: new ( udp_rx_buffer, udp_tx_buffer) ;
271
- example_udp_socket. bind ( endpoint) . unwrap ( ) ;
272
- sockets. add ( example_udp_socket) ;
273
-
274
- let tcp_rx_buffer = TcpSocketBuffer :: new ( vec ! [ 0 ; ethernet:: MTU ] ) ;
275
- let tcp_tx_buffer = TcpSocketBuffer :: new ( vec ! [ 0 ; ethernet:: MTU ] ) ;
276
- let mut example_tcp_socket = TcpSocket :: new ( tcp_rx_buffer, tcp_tx_buffer) ;
277
- example_tcp_socket. listen ( endpoint) . unwrap ( ) ;
278
- sockets. add ( example_tcp_socket) ;
279
- }
280
-
281
- // handle new ethernet packets
282
- if let Ok ( ref mut eth) = ethernet_interface {
283
- loop {
284
- match eth. poll (
285
- & mut sockets,
286
- Instant :: from_millis ( system_clock:: ms ( ) as i64 ) ,
287
- ) {
288
- Err ( :: smoltcp:: Error :: Exhausted ) => {
289
- await ! ( ethernet_task_idle_stream. next( ) ) . expect ( "idle stream closed" ) ;
290
- } ,
291
- Err ( :: smoltcp:: Error :: Unrecognized ) => { }
292
- Err ( e) => println ! ( "Network error: {:?}" , e) ,
293
- Ok ( socket_changed) => {
294
- if socket_changed {
295
- for mut socket in sockets. iter_mut ( ) {
296
- poll_socket ( & mut socket) . expect ( "socket poll failed" ) ;
297
- }
298
- }
299
- }
300
- }
301
- }
302
- }
303
- } ;
249
+ let ethernet_task = EthernetTask :: new ( idle_stream. clone ( ) , rcc, syscfg, ethernet_mac, ethernet_dma) ;
304
250
305
251
let i2c_3_mutex = Arc :: new ( FutureMutex :: new ( i2c_3) ) ;
306
252
let layer_1_mutex = Arc :: new ( FutureMutex :: new ( layer_1) ) ;
@@ -319,9 +265,15 @@ fn run() -> ! {
319
265
executor. spawn_local ( touch_task. run ( ) ) . unwrap ( ) ;
320
266
executor. spawn_local ( count_up_on_idle_task ( idle_stream. clone ( ) ) ) . unwrap ( ) ;
321
267
executor. spawn_local ( audio_task. run ( ) ) . unwrap ( ) ;
322
- //executor.spawn_local(ethernet_task).unwrap();
268
+
323
269
//executor.spawn_local(print_x);
324
270
271
+ // FIXME: Causes link error: no memory region specified for section '.ARM.extab'
272
+ //executor.spawn_local(_ethernet_task.run()).unwrap();
273
+
274
+ // FIXME: Does not work currently due to borrowing errors
275
+ // executor.spawn_local(sd_card_task(sd, idle_stream.clone())).unwrap();
276
+
325
277
let idle = async move {
326
278
loop {
327
279
let next_waker = await ! ( idle_waker_stream. next( ) ) . expect ( "idle channel closed" ) ;
@@ -338,38 +290,7 @@ fn run() -> ! {
338
290
}
339
291
}
340
292
} ,
341
- ) ;
342
-
343
-
344
- //let mut previous_button_state = pins.button.get();
345
- loop {
346
- /*
347
- // poll button state
348
- let current_button_state = pins.button.get();
349
- if current_button_state != previous_button_state {
350
- if current_button_state {
351
- pins.led.toggle();
352
-
353
- // trigger the `EXTI0` interrupt
354
- nvic.set_pending(Interrupt::EXTI0);
355
- }
356
-
357
- previous_button_state = current_button_state;
358
- }
359
- */
360
-
361
- //unsafe { audio_writer_task.resume() };
362
-
363
-
364
- // Initialize the SD Card on insert and deinitialize on extract.
365
- if sd. card_present ( ) && !sd. card_initialized ( ) {
366
- if let Some ( i_err) = sd:: init ( & mut sd) . err ( ) {
367
- println ! ( "{:?}" , i_err) ;
368
- }
369
- } else if !sd. card_present ( ) && sd. card_initialized ( ) {
370
- sd:: de_init ( & mut sd) ;
371
- }
372
- }
293
+ )
373
294
}
374
295
375
296
@@ -479,50 +400,146 @@ async fn count_up_on_idle_task(idle_stream: impl Stream<Item=()>) {
479
400
}
480
401
}
481
402
482
- fn poll_socket ( socket : & mut Socket ) -> Result < ( ) , smoltcp:: Error > {
483
- match socket {
484
- & mut Socket :: Udp ( ref mut socket) => match socket. endpoint ( ) . port {
485
- 15 => loop {
486
- let reply;
487
- match socket. recv ( ) {
488
- Ok ( ( data, remote_endpoint) ) => {
489
- let mut data = Vec :: from ( data) ;
490
- let len = data. len ( ) - 1 ;
491
- data[ ..len] . reverse ( ) ;
492
- reply = ( data, remote_endpoint) ;
403
+ async fn sd_card_task < S , P > ( mut sd : sd:: Sd < ' static , P > , idle_stream : S ) where S : Stream < Item =( ) > , P : InputPin {
404
+ pin_mut ! ( idle_stream) ;
405
+ // Initialize the SD Card on insert and deinitialize on extract.
406
+ loop {
407
+ await ! ( idle_stream. next( ) ) ;
408
+ if sd. card_present ( ) && !sd. card_initialized ( ) {
409
+ if let Some ( i_err) = sd:: init ( & mut sd) . err ( ) {
410
+ println ! ( "{:?}" , i_err) ;
411
+ }
412
+ } else if !sd. card_present ( ) && sd. card_initialized ( ) {
413
+ sd:: de_init ( & mut sd) ;
414
+ }
415
+ }
416
+ }
417
+
418
+ struct EthernetTask < S > where S : Stream < Item =( ) > {
419
+ idle_stream : S ,
420
+ rcc : RCC ,
421
+ syscfg : SYSCFG ,
422
+ ethernet_mac : ETHERNET_MAC ,
423
+ ethernet_dma : ETHERNET_DMA ,
424
+ }
425
+
426
+ impl < S > EthernetTask < S > where S : Stream < Item =( ) > {
427
+ fn new ( idle_stream : S , rcc : RCC , syscfg : SYSCFG , ethernet_mac : ETHERNET_MAC ,
428
+ ethernet_dma : ETHERNET_DMA ) -> Self
429
+ {
430
+ Self {
431
+ idle_stream,
432
+ rcc,
433
+ syscfg,
434
+ ethernet_mac,
435
+ ethernet_dma,
436
+ }
437
+ }
438
+
439
+ async fn run ( mut self ) {
440
+ let mut ethernet_interface = ethernet:: EthernetDevice :: new (
441
+ Default :: default ( ) ,
442
+ Default :: default ( ) ,
443
+ & mut self . rcc ,
444
+ & mut self . syscfg ,
445
+ & mut self . ethernet_mac ,
446
+ & mut self . ethernet_dma ,
447
+ ETH_ADDR ,
448
+ )
449
+ . map ( |device| device. into_interface ( IP_ADDR ) ) ;
450
+ if let Err ( e) = ethernet_interface {
451
+ println ! ( "ethernet init failed: {:?}" , e) ;
452
+ } ;
453
+
454
+ let idle_stream = self . idle_stream ;
455
+ pin_mut ! ( idle_stream) ;
456
+
457
+ let mut sockets = SocketSet :: new ( Vec :: new ( ) ) ;
458
+
459
+ if ethernet_interface. is_ok ( ) {
460
+ let endpoint = IpEndpoint :: new ( IpAddress :: Ipv4 ( IP_ADDR ) , 15 ) ;
461
+ let udp_rx_buffer = UdpSocketBuffer :: new ( vec ! [ UdpPacketMetadata :: EMPTY ; 3 ] , vec ! [ 0u8 ; 256 ] ) ;
462
+ let udp_tx_buffer = UdpSocketBuffer :: new ( vec ! [ UdpPacketMetadata :: EMPTY ; 1 ] , vec ! [ 0u8 ; 128 ] ) ;
463
+ let mut example_udp_socket = UdpSocket :: new ( udp_rx_buffer, udp_tx_buffer) ;
464
+ example_udp_socket. bind ( endpoint) . unwrap ( ) ;
465
+ sockets. add ( example_udp_socket) ;
466
+
467
+ let tcp_rx_buffer = TcpSocketBuffer :: new ( vec ! [ 0 ; ethernet:: MTU ] ) ;
468
+ let tcp_tx_buffer = TcpSocketBuffer :: new ( vec ! [ 0 ; ethernet:: MTU ] ) ;
469
+ let mut example_tcp_socket = TcpSocket :: new ( tcp_rx_buffer, tcp_tx_buffer) ;
470
+ example_tcp_socket. listen ( endpoint) . unwrap ( ) ;
471
+ sockets. add ( example_tcp_socket) ;
472
+ }
473
+
474
+ // handle new ethernet packets
475
+ if let Ok ( ref mut eth) = ethernet_interface {
476
+ loop {
477
+ match eth. poll (
478
+ & mut sockets,
479
+ Instant :: from_millis ( system_clock:: ms ( ) as i64 ) ,
480
+ ) {
481
+ Err ( :: smoltcp:: Error :: Exhausted ) => {
482
+ await ! ( idle_stream. next( ) ) . expect ( "idle stream closed" ) ;
483
+ } ,
484
+ Err ( :: smoltcp:: Error :: Unrecognized ) => { }
485
+ Err ( e) => println ! ( "Network error: {:?}" , e) ,
486
+ Ok ( socket_changed) => {
487
+ if socket_changed {
488
+ for mut socket in sockets. iter_mut ( ) {
489
+ Self :: poll_socket ( & mut socket) . expect ( "socket poll failed" ) ;
490
+ }
491
+ }
493
492
}
494
- Err ( smoltcp:: Error :: Exhausted ) => break ,
495
- Err ( err) => return Err ( err) ,
496
493
}
497
- socket. send_slice ( & reply. 0 , reply. 1 ) ?;
494
+ }
495
+ }
496
+ }
497
+
498
+ fn poll_socket ( socket : & mut Socket ) -> Result < ( ) , smoltcp:: Error > {
499
+ match socket {
500
+ & mut Socket :: Udp ( ref mut socket) => match socket. endpoint ( ) . port {
501
+ 15 => loop {
502
+ let reply;
503
+ match socket. recv ( ) {
504
+ Ok ( ( data, remote_endpoint) ) => {
505
+ let mut data = Vec :: from ( data) ;
506
+ let len = data. len ( ) - 1 ;
507
+ data[ ..len] . reverse ( ) ;
508
+ reply = ( data, remote_endpoint) ;
509
+ }
510
+ Err ( smoltcp:: Error :: Exhausted ) => break ,
511
+ Err ( err) => return Err ( err) ,
512
+ }
513
+ socket. send_slice ( & reply. 0 , reply. 1 ) ?;
514
+ } ,
515
+ _ => { }
498
516
} ,
499
- _ => { }
500
- } ,
501
- & mut Socket :: Tcp ( ref mut socket) => match socket. local_endpoint ( ) . port {
502
- 15 => {
503
- if !socket. may_recv ( ) {
504
- return Ok ( ( ) ) ;
505
- }
506
- let reply = socket. recv ( |data| {
507
- if data. len ( ) > 0 {
508
- let mut reply = Vec :: from ( "tcp: " ) ;
509
- let start_index = reply. len ( ) ;
510
- reply. extend_from_slice ( data) ;
511
- reply[ start_index..( start_index + data. len ( ) - 1 ) ] . reverse ( ) ;
512
- ( data. len ( ) , Some ( reply) )
513
- } else {
514
- ( data. len ( ) , None )
517
+ & mut Socket :: Tcp ( ref mut socket) => match socket. local_endpoint ( ) . port {
518
+ 15 => {
519
+ if !socket. may_recv ( ) {
520
+ return Ok ( ( ) ) ;
521
+ }
522
+ let reply = socket. recv ( |data| {
523
+ if data. len ( ) > 0 {
524
+ let mut reply = Vec :: from ( "tcp: " ) ;
525
+ let start_index = reply. len ( ) ;
526
+ reply. extend_from_slice ( data) ;
527
+ reply[ start_index..( start_index + data. len ( ) - 1 ) ] . reverse ( ) ;
528
+ ( data. len ( ) , Some ( reply) )
529
+ } else {
530
+ ( data. len ( ) , None )
531
+ }
532
+ } ) ?;
533
+ if let Some ( reply) = reply {
534
+ assert_eq ! ( socket. send_slice( & reply) ?, reply. len( ) ) ;
515
535
}
516
- } ) ?;
517
- if let Some ( reply) = reply {
518
- assert_eq ! ( socket. send_slice( & reply) ?, reply. len( ) ) ;
519
536
}
520
- }
537
+ _ => { }
538
+ } ,
521
539
_ => { }
522
- } ,
523
- _ => { }
540
+ }
541
+ Ok ( ( ) )
524
542
}
525
- Ok ( ( ) )
526
543
}
527
544
528
545
interrupt ! ( EXTI0 , exti0, state: Option <HStdout > = None ) ;
0 commit comments