Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Porting filesystem-fat to Another Microcontroll...

Avatar for Y_uuu Y_uuu
July 19, 2025

Porting filesystem-fat to Another Microcontroller: ESP32

2025-07-19(土)
PicoRuby Overflow会議
https://naniwarb.github.io/picorubyoverflowkaigi/

Avatar for Y_uuu

Y_uuu

July 19, 2025
Tweet

More Decks by Y_uuu

Other Decks in Technology

Transcript

  1. TFMGJOTQFDU w Ԭቌ༤ฏ w !:@VVV 9 !ZVVVOFU #MVF4LZ  w

    !ZVVV (JU)VC  w גࣜձࣾ'VTJDͷ*P5Ϋϥ΢υΤϯδχΞ w ϑΟϤϧυϒʔτΩϟϯϓͷϝϯλʔ 2
  2. 'MBTIϝϞϦͷύʔςΟγϣϯઃܭ w 'MBTIϝϞϦ্ͷͲͷྖҬʹϑΝΠϧγεςϜΛߏங͢Δ͔ܾΊΔ 26 ໊લ આ໌ Φϑηοτ αΠζ OWT ,FZ7BMVFͳ஋͕อଘ͞ΕΔ

    Y Y QIZ@JOJU 1):ͱݺ͹ΕΔ8J'J΍#MVFUPPUIͷઃఆ͕อଘ͞ΕΔ YG Y GBDUPSZ ϓϩάϥϜͷόΠφϦ͕ॻ͖ࠐ·ΕΔ Y . ۭ͖ྖҬ &41ͷ'MBTIϝϞϦͷύʔςΟγϣϯςʔϒϧ σϑΥϧτ
  3. 'MBTIϝϞϦͷύʔςΟγϣϯઃܭ w 'MBTIϝϞϦ্ͷͲͷྖҬʹϑΝΠϧγεςϜΛߏங͢Δ͔ܾΊΔ 27 ໊લ આ໌ Φϑηοτ αΠζ OWT ,FZ7BMVFͳ஋͕อଘ͞ΕΔ

    Y Y QIZ@JOJU 1):ͱݺ͹ΕΔ8J'J΍#MVFUPPUIͷઃఆ͕อଘ͞ΕΔ YG Y GBDUPSZ ϓϩάϥϜͷόΠφϦ͕ॻ͖ࠐ·ΕΔ Y . TUPSBHF '"5ϑΝΠϧγεςϜ Y . ۭ͖ྖҬ &41ͷ'MBTIϝϞϦͷύʔςΟγϣϯςʔϒϧ ΧελϚΠζޙ ޙ΄ͲඞཁͳͷͰ͓֮͑ͯ͘
  4. ͜͜·Ͱͷ·ͱΊ w 'MBTIϝϞϦ্ʹ.#ͷ'"5ϑΝΠϧγεςϜΛߏங͢Δ w QJDPSVCZ fi MFTZTUFNGBUͷ fl BTI@EJTLDΛ&41޲͚ʹϙʔςΟϯά͢Δ w

    ϓϩτλΠϓએݴΛม͑ͣʹத਎Λ࣮૷͠௚͢ w 'MBTIϝϞϦͷΦϑηοτY͔Β.#ͷྖҬΛॆͯΔ w 'MBTIϝϞϦͷηΫλαΠζ͸,#Ͱ͋Δ 29
  5. ύʔςΟγϣϯΛఆٛ w &41ͷ։ൃ؀ڥͰ͋Δ&41*%'ͷػೳΛ׆༻ w ϓϩδΣΫτ௚ԼʹQBSUJUJPOTDTWͱ͍͏ϑΝΠϧΛ࡞੒࣍͠ͷΑ͏ʹهࡌ 31 # N a m

    e , T y p e , S u b T y p e , O f f s e t , S i z e , F l a g s # N o t e : i f y o u h a v e i n c r e a s e d t h e b o o t l o a d e r s i z e , m a k e s u r e t o u p d a t e t h e o f f s e t s t o a v o i d o v e r l a p n v s , d a t a , n v s , 0 x 9 0 0 0 , 0 x 6 0 0 0 , p h y _ i n i t , d a t a , p h y , 0 x f 0 0 0 , 0 x 1 0 0 0 , f a c t o r y , a p p , f a c t o r y , 0 x 1 0 0 0 0 , 1 M , s t o r a g e , d a t a , f a t , , 1 M , TUPSBHFͱ͍͏.#ͷ'"5ྖҬΛ௥Ճ
  6. w NBJO$.BLF-JTUTUYUʹ'"5ϑΝΠϧγεςϜपΓͷઃఆΛ௥ه i d f _ c o m p

    o n e n t _ r e g i s t e r ( S R C S "m a i n . c " R E Q U I R E S p i c o r u b y - e s p 3 2 P R I V _ R E Q U I R E S s p i _ f l a s h I N C L U D E _ D I R S "" ) s e t ( i m a g e . . / s t o r a g e ) f a t f s _ c r e a t e _ r a w f l a s h _ i m a g e ( s t o r a g e $ { i m a g e } F L A S H _ I N _ P R O J E C T P R E S E R V E _ T I M E ) '"5ϑΝΠϧγεςϜͷΠϝʔδΛ࡞੒ˍॻ͖ࠐΈ 32 TUPSBHFσΟϨΫτϦΛ'"5ϑΝΠϧγεςϜͷ ΠϝʔδԽ͢ΔͨΊͷδΣωϨʔλΛ࢖༻
  7. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@XSJUF 'MBTIϝϞϦ΁ͷॻ͖ࠐΈؔ਺ 34 i n t F L

    A S H _ d i s k _ w r i t e ( c o n s t B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { } ॻ͖ࠐΉσʔλ ઌ಄ͷηΫλ൪߸ ॻ͖ࠐΉηΫλ਺  ͜͜ʹཁ݅Λຬͨ͢Α͏ͳίʔυΛॻ͘ 
  8. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@XSJUF 'MBTIϝϞϦ΁ͷॻ͖ࠐΈؔ਺ 35 i n t F L

    A S H _ d i s k _ w r i t e ( c o n s t B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { e s p _ f l a s h _ t * c h i p = e s p _ f l a s h _ d e f a u l t _ c h i p ; u i n t 3 2 _ t o f f s e t = F L A S H _ O F F S E T + ( s e c t o r * S P I _ F L A S H _ S E C _ S I Z E ) ; u i n t 3 2 _ t s i z e = c o u n t * S P I _ F L A S H _ S E C _ S I Z E ; e s p _ e r r _ t r e t = e s p _ f l a s h _ e r a s e _ r e g i o n ( c h i p , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t = e s p _ f l a s h _ w r i t e ( c h i p , b u f f , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t u r n R E S _ O K ; }
  9. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@XSJUF 'MBTIϝϞϦ΁ͷॻ͖ࠐΈؔ਺ 36 i n t F L

    A S H _ d i s k _ w r i t e ( c o n s t B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { e s p _ f l a s h _ t * c h i p = e s p _ f l a s h _ d e f a u l t _ c h i p ; u i n t 3 2 _ t o f f s e t = F L A S H _ O F F S E T + ( s e c t o r * S P I _ F L A S H _ S E C _ S I Z E ) ; u i n t 3 2 _ t s i z e = c o u n t * S P I _ F L A S H _ S E C _ S I Z E ; e s p _ e r r _ t r e t = e s p _ f l a s h _ e r a s e _ r e g i o n ( c h i p , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t = e s p _ f l a s h _ w r i t e ( c h i p , b u f f , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t u r n R E S _ O K ; } Y ,#
  10. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@XSJUF 'MBTIϝϞϦ΁ͷॻ͖ࠐΈؔ਺ 37 i n t F L

    A S H _ d i s k _ w r i t e ( c o n s t B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { e s p _ f l a s h _ t * c h i p = e s p _ f l a s h _ d e f a u l t _ c h i p ; u i n t 3 2 _ t o f f s e t = F L A S H _ O F F S E T + ( s e c t o r * S P I _ F L A S H _ S E C _ S I Z E ) ; u i n t 3 2 _ t s i z e = c o u n t * S P I _ F L A S H _ S E C _ S I Z E ; e s p _ e r r _ t r e t = e s p _ f l a s h _ e r a s e _ r e g i o n ( c h i p , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t = e s p _ f l a s h _ w r i t e ( c h i p , b u f f , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t u r n R E S _ O K ; } ॻ͖ࠐΈઌͷΞυϨεɾαΠζΛܭࢉ ॻ͖ࠐΈઌͷ'MBTIϝϞϦΛফڈ σʔλΛॻ͖ࠐΉ
  11. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@SFBE 'MBTIϝϞϦ͔ΒͷಡΈࠐΈؔ਺ 38 i n t F L

    A S H _ d i s k _ r e a d ( B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { } ಡΈࠐΜͩσʔλ ઌ಄ͷηΫλ൪߸ ಡΈࠐΉηΫλ਺  ͜͜ʹཁ݅Λຬͨ͢Α͏ͳίʔυΛॻ͘ 
  12. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@SFBE 'MBTIϝϞϦ͔ΒͷಡΈࠐΈؔ਺ 39 i n t F L

    A S H _ d i s k _ r e a d ( B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { e s p _ f l a s h _ t * c h i p = e s p _ f l a s h _ d e f a u l t _ c h i p ; u i n t 3 2 _ t o f f s e t = F L A S H _ O F F S E T + ( s e c t o r * S P I _ F L A S H _ S E C _ S I Z E ) ; u i n t 3 2 _ t s i z e = c o u n t * S P I _ F L A S H _ S E C _ S I Z E ; e s p _ e r r _ t r e t = e s p _ f l a s h _ r e a d ( c h i p , b u f f , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t u r n R E S _ O K ; }
  13. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@SFBE 'MBTIϝϞϦ͔ΒͷಡΈࠐΈؔ਺ 40 i n t F L

    A S H _ d i s k _ r e a d ( B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { e s p _ f l a s h _ t * c h i p = e s p _ f l a s h _ d e f a u l t _ c h i p ; u i n t 3 2 _ t o f f s e t = F L A S H _ O F F S E T + ( s e c t o r * S P I _ F L A S H _ S E C _ S I Z E ) ; u i n t 3 2 _ t s i z e = c o u n t * S P I _ F L A S H _ S E C _ S I Z E ; e s p _ e r r _ t r e t = e s p _ f l a s h _ r e a d ( c h i p , b u f f , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t u r n R E S _ O K ; } Y ,#
  14. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@SFBE 'MBTIϝϞϦ͔ΒͷಡΈࠐΈؔ਺ 41 i n t F L

    A S H _ d i s k _ r e a d ( B Y T E * b u f f , L B A _ t s e c t o r , U I N T c o u n t ) { e s p _ f l a s h _ t * c h i p = e s p _ f l a s h _ d e f a u l t _ c h i p ; u i n t 3 2 _ t o f f s e t = F L A S H _ O F F S E T + ( s e c t o r * S P I _ F L A S H _ S E C _ S I Z E ) ; u i n t 3 2 _ t s i z e = c o u n t * S P I _ F L A S H _ S E C _ S I Z E ; e s p _ e r r _ t r e t = e s p _ f l a s h _ r e a d ( c h i p , b u f f , o f f s e t , s i z e ) ; i f ( r e t ! = E S P _ O K ) r e t u r n R E S _ E R R O R ; r e t u r n R E S _ O K ; } ಡΈग़͠ݩͷΞυϨεɾαΠζΛܭࢉ ಡΈग़͢
  15. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@JPDUM 'MBTIϝϞϦͷঢ়ଶมߋ΍ঢ়ଶऔಘ 42 D R E S U

    L T F L A S H _ d i s k _ i o c t l ( B Y T E c m d , v o i d * b u f f ) { } ίϚϯυ ݁Ռͷ֨ೲઌ
  16. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@JPDUM 'MBTIϝϞϦͷঢ়ଶมߋ΍ঢ়ଶऔಘ 43 D R E S U

    L T F L A S H _ d i s k _ i o c t l ( B Y T E c m d , v o i d * b u f f ) { s w i t c h ( c m d ) { / * 省略 * / c a s e G E T _ S E C T O R _ S I Z E : * ( ( W O R D * ) b u f f ) = ( W O R D ) S P I _ F L A S H _ S E C _ S I Z E ; b r e a k ; c a s e G E T _ S E C T O R _ C O U N T : * ( ( L B A _ t * ) b u f f ) = ( L B A _ t ) ( F L A S H _ S I Z E / S P I _ F L A S H _ S E C _ S I Z E ) ; b r e a k ; d e f a u l t : r e t u r n R E S _ P A R E R R ; } r e t u r n R E S _ O K ;
  17. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@JPDUM 'MBTIϝϞϦͷঢ়ଶมߋ΍ঢ়ଶऔಘ 44 D R E S U

    L T F L A S H _ d i s k _ i o c t l ( B Y T E c m d , v o i d * b u f f ) { s w i t c h ( c m d ) { / * 省略 * / c a s e G E T _ S E C T O R _ S I Z E : * ( ( W O R D * ) b u f f ) = ( W O R D ) S P I _ F L A S H _ S E C _ S I Z E ; b r e a k ; c a s e G E T _ S E C T O R _ C O U N T : * ( ( L B A _ t * ) b u f f ) = ( L B A _ t ) ( F L A S H _ S I Z E / S P I _ F L A S H _ S E C _ S I Z E ) ; b r e a k ; d e f a u l t : r e t u r n R E S _ P A R E R R ; } r e t u r n R E S _ O K ; .# ,#
  18. GMBTI@EJTLDͷϙʔςΟϯά w '-"4)@EJTL@JPDUM 'MBTIϝϞϦͷঢ়ଶมߋ΍ঢ়ଶऔಘ 45 D R E S U

    L T F L A S H _ d i s k _ i o c t l ( B Y T E c m d , v o i d * b u f f ) { s w i t c h ( c m d ) { / * 省略 * / c a s e G E T _ S E C T O R _ S I Z E : * ( ( W O R D * ) b u f f ) = ( W O R D ) S P I _ F L A S H _ S E C _ S I Z E ; b r e a k ; c a s e G E T _ S E C T O R _ C O U N T : * ( ( L B A _ t * ) b u f f ) = ( L B A _ t ) ( F L A S H _ S I Z E / S P I _ F L A S H _ S E C _ S I Z E ) ; b r e a k ; d e f a u l t : r e t u r n R E S _ P A R E R R ; } r e t u r n R E S _ O K ; ηΫλαΠζ ,# Λ֨ೲ ηΫλ਺ .#,# Λ֨ೲ
  19. NBJO@UBTLSC͔Βͷݺͼग़͠ w 1JDP3VCZ7.ىಈ௚ޙͷॲཧͰ'"5ϑΝΠϧγεςϜΛॳظԽ 46 r e q u i r

    e "s h e l l " # S e t u p f l a s h d i s k b e g i n S T D I N . e c h o = f a l s e p u t s "I n i t i a l i z i n g F L A S H d i s k a s t h e r o o t v o l u m e . . . " S h e l l . s e t u p _ r o o t _ v o l u m e ( : f l a s h , l a b e l : ' s t o r a g e ' ) S h e l l . s e t u p _ s y s t e m _ f i l e s p u t s "A v a i l a b l e " r e s c u e = > e p u t s "N o t a v a i l a b l e " p u t s "# { e . m e s s a g e } ( # { e . c l a s s } ) " e n d
  20. NBJO@UBTLSC͔Βͷݺͼग़͠ w 1JDP3VCZ7.ىಈ௚ޙͷॲཧͰ'"5ϑΝΠϧγεςϜΛॳظԽ 47 r e q u i r

    e "s h e l l " # S e t u p f l a s h d i s k b e g i n S T D I N . e c h o = f a l s e p u t s "I n i t i a l i z i n g F L A S H d i s k a s t h e r o o t v o l u m e . . . " S h e l l . s e t u p _ r o o t _ v o l u m e ( : f l a s h , l a b e l : ' s t o r a g e ' ) S h e l l . s e t u p _ s y s t e m _ f i l e s p u t s "A v a i l a b l e " r e s c u e = > e p u t s "N o t a v a i l a b l e " p u t s "# { e . m e s s a g e } ( # { e . c l a s s } ) " e n d ϧʔτϘϦϡʔϜͷ࡞੒ॲཧ ΠϝʔδΛॻ͖ࠐΜͩ࣌఺ͰAA͸ ଘࡏ͢ΔͷͰԿ΋͠ͳ͍
  21. NBJO@UBTLSC͔Βͷݺͼग़͠ w 1JDP3VCZ7.ىಈ௚ޙͷॲཧͰ'"5ϑΝΠϧγεςϜΛॳظԽ 48 r e q u i r

    e "s h e l l " # S e t u p f l a s h d i s k b e g i n S T D I N . e c h o = f a l s e p u t s "I n i t i a l i z i n g F L A S H d i s k a s t h e r o o t v o l u m e . . . " S h e l l . s e t u p _ r o o t _ v o l u m e ( : f l a s h , l a b e l : ' s t o r a g e ' ) S h e l l . s e t u p _ s y s t e m _ f i l e s p u t s "A v a i l a b l e " r e s c u e = > e p u t s "N o t a v a i l a b l e " p u t s "# { e . m e s s a g e } ( # { e . c l a s s } ) " e n d CJO΍FUDJOJUEͳͲʹ ϑΝΠϧΛ഑ஔ͢Δ
  22. 5*14TUPSBHFͷॻ͖׵͑Λͪΐͬͱ͚ͩߴ଎Խ͢Δ w SBLF ਖ਼֬ʹ͸SBLF fl BTI ͸ҎԼΛશͯॻ͖׵͍͕͔͔͑ͯͯ࣌ؒΔ 52 ໊લ આ໌

    Φϑηοτ αΠζ OWT ,FZ7BMVFͳ஋͕อଘ͞ΕΔ Y Y QIZ@JOJU 1):ͱݺ͹ΕΔ8J'J΍#MVFUPPUIͷઃఆ͕อଘ͞ΕΔ YG Y GBDUPSZ ϓϩάϥϜͷόΠφϦ͕ॻ͖ࠐ·ΕΔ Y . TUPSBHF '"5ϑΝΠϧγεςϜ Y . ۭ͖ྖҬ &41ͷ'MBTIϝϞϦͷύʔςΟγϣϯςʔϒϧ ΧελϚΠζޙ
  23. 5*14TUPSBHFͷॻ͖׵͑Λͪΐͬͱ͚ͩߴ଎Խ͢Δ w SBLF ਖ਼֬ʹ͸SBLF fl BTI ͸ҎԼΛશͯॻ͖׵͍͕͔͔͑ͯͯ࣌ؒΔ 53 ໊લ આ໌

    Φϑηοτ αΠζ OWT ,FZ7BMVFͳ஋͕อଘ͞ΕΔ Y Y QIZ@JOJU 1):ͱݺ͹ΕΔ8J'J΍#MVFUPPUIͷઃఆ͕อଘ͞ΕΔ YG Y GBDUPSZ ϓϩάϥϜͷόΠφϦ͕ॻ͖ࠐ·ΕΔ Y . TUPSBHF '"5ϑΝΠϧγεςϜ Y . ۭ͖ྖҬ &41ͷ'MBTIϝϞϦͷύʔςΟγϣϯςʔϒϧ ΧελϚΠζޙ ΞϓϦέʔγϣϯίʔυΛࠩ͠ସ͑Δࡍ͸ ͚ͩ͜͜ॻ͖׵͑Ε͹Α͍