11use crate :: endpoint:: NUM_ENDPOINTS ;
2- use crate :: { UsbPeripheral , Word } ;
2+ use crate :: { SramAccessScheme , UsbPeripheral , Word } ;
33use core:: marker:: PhantomData ;
4- use core:: slice ;
4+ use core:: mem ;
55use usb_device:: { Result , UsbError } ;
6- use vcell:: VolatileCell ;
76
87pub struct EndpointBuffer < USB : UsbPeripheral > {
9- mem : & ' static mut [ VolatileCell < USB :: Word > ] ,
8+ ptr : * mut <USB :: SramAccessScheme as SramAccessScheme >:: Word ,
9+ word_count : usize ,
1010 marker : PhantomData < USB > ,
1111}
1212
13+ unsafe impl < USB : UsbPeripheral > Send for EndpointBuffer < USB > { }
14+
1315impl < USB : UsbPeripheral > EndpointBuffer < USB > {
1416 pub fn new ( offset_bytes : usize , size_bytes : usize ) -> Self {
15- let ep_mem_ptr = USB :: EP_MEMORY as * mut VolatileCell < _ > ;
16-
17- let offset_words = offset_bytes >> 1 ;
18- let count_words = size_bytes >> 1 ;
19- let offset_u16_words;
20- let count_u16_words;
21- if USB :: EP_MEMORY_ACCESS_2X16 {
22- offset_u16_words = offset_words;
23- count_u16_words = count_words;
24- } else {
25- offset_u16_words = offset_words * 2 ;
26- count_u16_words = count_words * 2 ;
27- } ;
17+ let ep_mem_ptr = USB :: EP_MEMORY as * mut <USB :: SramAccessScheme as SramAccessScheme >:: Word ;
18+
19+ let word_size = Self :: word_size ( ) ;
20+ let offset_words = offset_bytes / word_size;
21+ let word_count = size_bytes / word_size;
22+
23+ let offset_words = offset_words * USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
24+ let word_count = word_count * USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
2825
2926 unsafe {
30- let mem = slice :: from_raw_parts_mut ( ep_mem_ptr. add ( offset_u16_words ) , count_u16_words ) ;
27+ let ptr = ep_mem_ptr. add ( offset_words ) ;
3128 Self {
32- mem,
29+ ptr,
30+ word_count,
3331 marker : PhantomData ,
3432 }
3533 }
3634 }
3735
36+ fn word_size ( ) -> usize {
37+ mem:: size_of :: < <USB :: SramAccessScheme as SramAccessScheme >:: Word > ( )
38+ }
39+
3840 #[ inline( always) ]
39- fn read_word ( & self , index : usize ) -> USB :: Word {
40- if USB :: EP_MEMORY_ACCESS_2X16 {
41- self . mem [ index] . get ( )
42- } else {
43- self . mem [ index * 2 ] . get ( )
44- }
41+ fn read_word ( & self , index : usize ) -> <USB :: SramAccessScheme as SramAccessScheme >:: Word {
42+ let index = index * USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
43+ assert ! ( index < self . word_count) ;
44+ unsafe { self . ptr . add ( index) . read_volatile ( ) }
4545 }
4646
4747 #[ inline( always) ]
48- fn write_word ( & self , index : usize , value : USB :: Word ) {
49- if USB :: EP_MEMORY_ACCESS_2X16 {
50- self . mem [ index ] . set ( value ) ;
51- } else {
52- self . mem [ index * 2 ] . set ( value) ;
48+ fn write_word ( & self , index : usize , value : < USB :: SramAccessScheme as SramAccessScheme > :: Word ) {
49+ let index = index * USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
50+ assert ! ( index < self . word_count ) ;
51+ unsafe {
52+ self . ptr . add ( index) . write_volatile ( value) ;
5353 }
5454 }
5555
@@ -75,45 +75,57 @@ impl<USB: UsbPeripheral> EndpointBuffer<USB> {
7575 }
7676
7777 pub fn offset ( & self ) -> u16 {
78- let buffer_address = self . mem . as_ptr ( ) as usize ;
79- let word_size = if USB :: EP_MEMORY_ACCESS_2X16 { 2 } else { 4 } ;
80- let index = ( buffer_address - USB :: EP_MEMORY as usize ) / word_size;
81- ( index << 1 ) as u16
78+ let buffer_address = self . ptr as usize ;
79+ let word_size = Self :: word_size ( ) ;
80+ let offset_per_word = word_size * USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
81+ let index = ( buffer_address - USB :: EP_MEMORY as usize ) / offset_per_word;
82+ ( index * word_size) as u16
8283 }
8384
85+ /// Capacity in bytes
8486 pub fn capacity ( & self ) -> usize {
85- let len_words = if USB :: EP_MEMORY_ACCESS_2X16 {
86- self . mem . len ( )
87- } else {
88- self . mem . len ( ) / 2
89- } ;
90- len_words << 1
87+ let len_words = self . word_count / USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
88+ let word_size = Self :: word_size ( ) ;
89+ len_words * word_size
9190 }
9291}
9392
9493#[ repr( C ) ]
9594pub struct BufferDescriptor < USB : UsbPeripheral > {
96- ptr : * const VolatileCell < USB :: Word > ,
95+ ptr : * mut <USB :: SramAccessScheme as SramAccessScheme > :: Word ,
9796 marker : PhantomData < USB > ,
9897}
9998
99+ pub struct DescriptorPart {
100+ pub address : u16 ,
101+ pub count : u16 ,
102+ }
103+
100104impl < USB : UsbPeripheral > BufferDescriptor < USB > {
101105 #[ inline( always) ]
102- fn field ( & self , index : usize ) -> & ' static VolatileCell < USB :: Word > {
103- let mul = if USB :: EP_MEMORY_ACCESS_2X16 { 1 } else { 2 } ;
104- unsafe { & * ( self . ptr . add ( index * mul) ) }
106+ pub fn set_tx ( & self , address : u16 , count : u16 ) {
107+ unsafe {
108+ USB :: SramAccessScheme :: set ( self . ptr , crate :: AccessType :: Tx , address, count) ;
109+ }
105110 }
106111
107112 #[ inline( always) ]
108- pub fn set_tx ( & self , address : u16 , count : u16 ) {
109- self . field ( 0 ) // addr
110- self. field ( 1 ) // count (msb in 32bit)
113+ pub fn get_tx ( & self ) -> DescriptorPart {
114+ let ( address, count) = unsafe { USB :: SramAccessScheme :: read ( self . ptr , crate :: AccessType :: Tx ) } ;
115+ DescriptorPart { address, count }
116+ }
117+
118+ #[ inline( always) ]
119+ pub fn set_rx ( & self , address : u16 , count : u16 ) {
120+ unsafe {
121+ USB :: SramAccessScheme :: set ( self . ptr , crate :: AccessType :: Rx , address, count) ;
122+ }
111123 }
112124
113125 #[ inline( always) ]
114- pub fn get_rx ( & self ) -> ( u16 , u16 ) {
115- self . field ( 2 ) // addr
116- self . field ( 3 ) // count(msb in 32bit)
126+ pub fn get_rx ( & self ) -> DescriptorPart {
127+ let ( address , count ) = unsafe { USB :: SramAccessScheme :: read ( self . ptr , crate :: AccessType :: Rx ) } ;
128+ DescriptorPart { address , count }
117129 }
118130}
119131
@@ -145,10 +157,15 @@ impl<USB: UsbPeripheral> EndpointMemoryAllocator<USB> {
145157 }
146158
147159 pub fn buffer_descriptor ( index : u8 ) -> BufferDescriptor < USB > {
148- let mul = if USB :: EP_MEMORY_ACCESS_2X16 { 1 } else { 2 } ;
160+ let mul = USB :: SramAccessScheme :: ADDRESS_MULTIPLIER ;
161+ let word_size = mem:: size_of :: < <USB :: SramAccessScheme as SramAccessScheme >:: Word > ( ) ;
149162
163+ // 4xu16=8Bytes worth of data per descriptor
164+ let descriptor_size_bytes = 8 ;
165+ let offset_per_descriptor = descriptor_size_bytes * mul / word_size;
150166 unsafe {
151- let ptr = ( USB :: EP_MEMORY as * const VolatileCell < USB :: Word > ) . add ( ( index as usize ) * 4 * mul) ;
167+ let ptr = ( USB :: EP_MEMORY as * mut <USB :: SramAccessScheme as SramAccessScheme >:: Word )
168+ . add ( ( index as usize ) * offset_per_descriptor) ;
152169 BufferDescriptor {
153170 ptr,
154171 marker : Default :: default ( ) ,
0 commit comments