рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдирдпрд╛ рдЬреАрд╡рдиред рднрд╛рдЧ реи

рдкреБрд░рд╛рдиреЗ рдмрд░реНрди-рдЖрдЙрдЯ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдХреА рдирд┐рд░рдВрддрд░рддрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдПрдВрдмреЗрдбрд╕реНрдХреА рдИ 8 рдорд┐рдиреА-рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдзреНрд╡рдирд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рдЬрдЧрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рдЬреАрд╡рди рд╕рд╛рдБрд╕ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рдпреЛрдЬрдирд╛ рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред







рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╕рдорд╛рдзрд╛рди рдХреА рддрдХрдиреАрдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рдирдП "рдорд╕реНрддрд┐рд╖реНрдХ" рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЪреБрдирдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛, рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм, рд▓реЛрд╣реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рдХреАрдмреЛрд░реНрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рднрд╛рдЧ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛ред





рдХреАрдмреЛрд░реНрдб рдореИрдЯреНрд░рд┐рдХреНрд╕


рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдХреАрдмреЛрд░реНрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рдХреАрдмреЛрд░реНрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреЛ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдХрдИ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдиреЗ рд╢рд╛рдпрдж рдЕрдкрдиреЗ рд▓реНрдпреВрдбрд┐рдиреЛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ (рд╕рдмрд╕реЗ рд╕рд╕реНрддрд╛ рдореЙрдбрд▓) рд╕реЗ рджреЛ (рдореЙрдбрд▓ рдХреЗ рдереЛрдХ рдореЗрдВ) рд╕реНрд╡рд┐рдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рджреЛ рдЖрд╕рдиреНрди рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдХреБрдВрдЬреА рджрдмрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕рд╢рд░реНрдд рдмрд▓ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЬрд┐рд╕ рдЧрддрд┐ рд╕реЗ рдХреБрдВрдЬреА рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡реЙрд▓реНрдпреВрдо рдХреА рдПрдХ рдзреНрд╡рдирд┐ рдкреБрди: рдЙрддреНрдкрдиреНрди рд╣реЛред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:





рдмреЛрд░реНрдб рдХреЗ рдкреАрдЫреЗ рдбрд╛рдпреЛрдб рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рд╕рдордп рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреЗ "рдЭреВрдареЗ" рдкрдврд╝рдиреЗ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреАрдмреЛрд░реНрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд░реНрдХрд┐рдЯ рдЖрд░реЗрдЦ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдпреЗ рджреЛ рд╕реНрд╡рд┐рдЪ рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реЗ рдбрд╛рдпреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:





рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрддрдВрднреЛрдВ (рдПрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдкрд┐рди) рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ (рдмреА рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рдкрд┐рди) рдкрд░ рд╕реНрддрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕реНрддрд░ рдКрдВрдЪрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп "рдХреЙрд▓рдо-рдкрдВрдХреНрддрд┐" рд╕рдВрдпреЛрдЬрди рдХреЗ рдЕрдиреБрд░реВрдк рдХреБрдВрдЬреА рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрд░реЗрдЦ рдХреАрдмреЛрд░реНрдб рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ - рдХреБрд▓ 76 рдХреБрдВрдЬреА (13 рд▓рд╛рдЗрдиреЗрдВ рдФрд░ 6 x 2 рдХреЙрд▓рдо рд╣реИрдВ, рдЬреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрд▓ 156 рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ 25 рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ) рджреЗрддрд╛ рд╣реИред рдкреВрд░реЗ рдХреАрдмреЛрд░реНрдб рдХреА рд╕реНрдХреИрдирд┐рдВрдЧ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХрдИ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд▓рд╛рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд╣реЛрддреА рд╣реИред



рдореЗрд░реЗ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдореЗрдВ, рдХреАрдмреЛрд░реНрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ 8-рдмрд┐рдЯ, рдПрдХ рдмрд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпреЛрдЧреНрдп рд╣рд┐рддрд╛рдЪреА HD63B05V0 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ 8 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ 4 рдХреЗрдмреА рд░реЛрдо рдФрд░ 192 рд░реИрдо рдореЗрдореЛрд░реА рдмрд╛рдЗрдЯреНрд╕ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдмрд┐рдЬрд▓реА рдХреА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдореЗрд░реЗ рдореМрдЬреВрджрд╛ ATmega162 рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдВрдЧрдд рдирд┐рдХрд▓рд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдмреЛрд░реНрдб рдкрд░ рдХреЗрд╡рд▓ 2 рдкрдЯрд░рд┐рдпреЛрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЯрд╛рдВрдХрд╛ рд▓рдЧрд╛рдХрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ RESET рдкрд┐рди рд╣реИ, рдЬреЛ рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рд╣реИред рдЬреИрд╕реЗ HD63B05V0ред



рдЪреВрдВрдХрд┐ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд UART (рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрдиреНрдп рдкрд┐рди рдкрд░ рднреА рдерд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЧрдИ рдереА, рдореИрдВрдиреЗ рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдмрдВрджрд░рдЧрд╛рд╣ рдХреЗ рдЗрд╕ рдПрдХ рддрд░рдлрд╛ (рдХреЗрд╡рд▓-рд▓реЗрдЦрди) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, TinySafeBoot рдмреВрдЯрд▓реЛрдбрд░, рдЬреЛ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рднрд╡рд┐рд╖реНрдп рдХреЗ рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдкрдбреЗрдЯ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рд╕рднреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рддреНрд╡рд░рд┐рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрдерди + рдХреНрдпреВрдЯреА 5 рдЪреБрдирд╛ рд╣реИ, рдЯрд╛рдЗрдиреАрд╕реЗрдлрд╝рдмреВрдЯ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рднреА рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрд╡реАрдЖрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдлрд░реНрдорд╡реЗрдпрд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрд╡реАрдЖрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдЦреБрдж рдПрдВрдмрд░реНрдЯрд╕реНрдХреА рдИ 8 рдмреЛрд░реНрдб рдкрд░ UART1 рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ рдФрд░ рд╕реНрддрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП 3.3V рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реИред



AVR рдХреЗ рд▓рд┐рдП рдлрд╝рд░реНрдорд╡реЗрдпрд░ рд╕реНрд░реЛрдд
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <string.h> #include "dbg_putchar.h" #define MIDI_BASE 18 #define ZERO_BASE 28 #define KEYS_COUNT 76 #define hiz(port, dir) do { \ (dir) = 0; \ (port) = 0; \ } while(0) #define alow(port, dir) do { \ (dir) = 0xff; \ (port) = 0; \ } while(0) uint8_t keys[KEYS_COUNT]; /* Get state of a row by its index * starting from 1 to 13 */ uint8_t getRow(uint8_t idx) { if (idx <= 8) { return (PINC & (1 << (8 - idx))); } else if (idx >= 9 && idx <= 11) { return (PINE & (1 << (11 - idx))); } else if (idx == 12) { return (PINA & (1 << PIN6)); } else if (idx == 13) { return (PINA & (1 << PIN4)); } return 0; } inline void activateColumn1(uint8_t idx) { PORTD = 0x00 | (1 << (8 - idx)); PORTB = 0x00; } void activateColumn2(uint8_t idx) { if (idx <= 3) { PORTB = 0x00 | (1 << (idx + 4)); PORTD = 0x00; } else if (idx == 4) { PORTB = 0x00 | (1 << PIN4); PORTD = 0x00; } else if (idx == 5 || idx == 6) { PORTD = 0x00 | (1 << (idx - 5)); PORTB = 0x00; } } inline void deactivateColumns(void) { PORTD = 0x00; PORTB = 0x00; } inline void initPorts(void) { hiz(PORTA, DDRA); hiz(PORTC, DDRC); hiz(PORTE, DDRE); PORTB = 0x00; DDRB = 0xfe; DDRD = 0xff; } void resetRows(void) { /* output low */ alow(PORTC, DDRC); alow(PORTE, DDRE); /* don't touch PA7 & PA5 */ DDRA |= 0x5f; PORTA &= ~0x5f; _delay_us(10); /* back to floating input */ hiz(PORTC, DDRC); hiz(PORTE, DDRE); DDRA &= ~0x5f; } /* base MIDI note number is 25: C#0 */ int main(void) { uint8_t row, col, layer; uint8_t note, offset; initPorts(); memset(keys, 0, sizeof(keys)); dbg_tx_init(); dbg_putchar('O'); dbg_putchar('K'); while(1) { for (layer = 0; layer < 2; layer++) { for (col = 1; col <= 6; col++) { if (!layer) activateColumn1(col); else activateColumn2(col); for (row = 1; row <= 13; row++) { note = 6 * row + col + MIDI_BASE; offset = note - ZERO_BASE; if (getRow(row)) { if (!layer) { /* increase velocity counter */ if (keys[offset] < 254 && !(keys[offset] & 0x80)) keys[offset]++; } else { if (!(keys[offset] & 0x80)) { /* generate note-on event */ dbg_putchar(0x90); dbg_putchar(note); /*dbg_putchar(keys[offset]);*/ dbg_putchar(0x7f); /* stop counting */ keys[offset] |= 0x80; } } } else { if (layer) continue; if (keys[offset] & 0x80) { /* generate note off event */ dbg_putchar(0x90); dbg_putchar(note); dbg_putchar(0x00); /* reset key state */ keys[offset] = 0x00; } } } deactivateColumns(); resetRows(); } } } return 0; }
      
      







TinySafeBoot рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓
 import serial import binascii import struct import intelhex import sys class TSB(object): CONFIRM = '!' REQUEST = '?' def __init__(self, port): self.port = serial.Serial(port, baudrate=9600, timeout=1) self.flashsz = 0 def check(self): if not self.flashsz: raise Exception("Not activated") def activate(self): self.port.write("@@@") (self.tsb, self.version, self.status, self.sign, self.pagesz, self.flashsz, self.eepsz) = \ struct.unpack("<3sHB3sBHH", self.port.read(14)) self.port.read(2) self.pagesz *= 2 self.flashsz *= 2 self.eepsz += 1 assert(self.port.read() == self.CONFIRM) def rflash(self, progress=None, size=0): self.check() self.port.write("f") self.addr = 0 self.flash = "" size = self.flashsz if not size else size while self.addr < size: if progress is not None: progress("read", self.addr, size) self.port.write(self.CONFIRM) page = self.port.read(self.pagesz) if len(page) != self.pagesz: raise Exception("Received page too short: %d" % len(page)) self.addr += len(page) self.flash += page return self.flash.rstrip('\xff') def wflash(self, data, progress=None): if len(data) % self.pagesz != 0: data = data + "\xff" * (self.pagesz - (len(data) % self.pagesz)) assert(len(data) % self.pagesz == 0) self.check() self.port.write("F") self.addr = 0 assert(self.port.read() == self.REQUEST) while self.addr < len(data): if progress is not None: progress("write", self.addr, len(data)) self.port.write(self.CONFIRM) self.port.write(data[self.addr:self.addr + self.pagesz]) self.addr += self.pagesz assert(self.port.read() == self.REQUEST) self.port.write(self.REQUEST) return self.port.read() == self.CONFIRM def vflash(self, data, progress=None): fw = self.rflash(progress, len(data)) return fw == data def info(self): print "Tiny Safe Bootloader: %s" % self.tsb print "Page size: %d" % self.pagesz print "Flash size: %d" % self.flashsz print "EEPROM size: %d" % self.eepsz if __name__ == "__main__": import argparse def progress(op, addr, total): sys.stdout.write("\r%s address: $%0.4x/$%0.4x" % (op, addr, total)) sys.stdout.flush() parser = argparse.ArgumentParser() parser.add_argument("filename", help="firmware file in Intel HEX format") parser.add_argument("--device", help="Serial port to use for programming", default="/dev/ttyUSB0") args = parser.parse_args() tsb = TSB(args.device) tsb.activate() tsb.info() fw = intelhex.IntelHex(args.filename) assert(tsb.wflash(fw.tobinstr(), progress)) assert(tsb.vflash(fw.tobinstr(), progress)) print "\nOK\n"
      
      







AVR рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪрдкреИрдб MSP430 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореЗрд░реЗ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд╣реЛрдордореЗрдб рдЪрдорддреНрдХрд╛рд░ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛) рдиреЗ рдЪреАрди рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ TL866CS MiniPromermer рдХреЛ рд░рд╛рд╕реНрддрд╛ рджрд┐рдпрд╛ред рдирдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рднрд╛рд╡рдирд╛ рдмреЗрд╣рдж рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИред



рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рдХреАрдмреЛрд░реНрдб рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдЗрд╕реЗ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рд░реИрдо рдЪрд┐рдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреИрдирд┐рдВрдЧ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдореВрд▓ рддрд░реАрдХрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, OpenMusicLabs рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред



рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдкреНрд░реАрдореЗрд╢рди рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд░реНрдиреЗрд▓ рдЦрд╛рдирд╛ рдмрдирд╛рдирд╛


рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╢реЗрдбреНрдпреВрд▓рд░ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдзреНрд╡рдирд┐ рдЦреЗрд▓рддреЗ рд╕рдордп рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЦреЗрд▓ рд╣рд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ PREEPMT RT рдкреИрдЪ рдХреЗ рд╕рд╛рде рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рдзрд╛рди рднреА "рдкреНрд░рдХреНрд░рд┐рдпрд╛" рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред S5PV210 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рд╕реИрдорд╕рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рдореВрд▓ рдХреЛрд░, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг 3.0.8 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг (3.0.8) рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз RT_PREEMPT рдкреИрдЪ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмрд┐рдирд╛ рд╡рд┐рд░реЛрдз рдХреЗ рд╕реНрд░реЛрдд рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рд╕рднреА рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо 3.0.8-rt23 рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред



рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕реНрдкрд┐рдирд▓реЙрдХ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдЬреИрд╕реА рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛рдПрдВ рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реБрдИрдВ, рдХреБрдЫ рдкрд░рд┐рдзреАрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛, рдПрдХ рдХреИрдкреЗрд╕рд┐рдЯрд┐рд╡ рдЯрдЪрд╕реНрдХреНрд░реАрди рдирд┐рдпрдВрддреНрд░рдХ, рдФрд░, рдЬреЛ рд╕рдмрд╕реЗ рднрдпрд╛рдирдХ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдСрдбрд┐рдпреЛ рдХреЛрдбреЗрдХред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рд▓реМрдЯ рдЖрдПрдВрдЧреЗ, рдФрд░ рдЕрдм рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рддрд╛рдЬрд╛ рдЗрдХрдЯреНрдареЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ ... рд╣рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рдХрд░реНрдиреЗрд▓ рдЖрддрдВрдХ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣ рдкрд╣рд▓реЗ рднреА рд╣реБрдЖ рдерд╛ рдЬрдм kgdb рдбреАрдмрдЧрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рд╢реБрд░реВ рд╣реБрдЖ рд╣реЛ), рдЗрд╕рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ init/main.c



рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд┐рдВрдЯрдлреЙрд░реНрдореНрд╕ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдереЗ, рд╕реНрдерд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП start_kernel



рдлрд╝рдВрдХреНрд╢рдиред рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдЪрд░рдорд░рд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рдХрд░реНрдиреЗрд▓ рдХрд░рдиреЗ рдореЗрдВ hrtimers_init()



, рдЙрд╕реЗ hrtimers_init()



рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдЙрдЪреНрдЪ-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЯрд╛рдЗрдорд░ рдФрд░ рдЙрдирдХреЗ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ arch/arm/plat-s5p/hr-time-rtc.c



ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, PREEMPT RT рдкреИрдЪ рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдзрд╛рдПрдВ рдзрд╛рдЧреЗ рдмрди рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ PREEMPT RT рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рд▓рдЧрднрдЧ рд╕рднреА рдЕрд╡рд░реЛрдзреЛрдВ рдХреЛ рд╡реИрд╕рд╛ рд╣реА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрди рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП kthreadd_task рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ start_kernel



рдлрд╝рдВрдХреНрд╢рди - рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд░рдВрднрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред рдЧрд┐рд░рд╛рд╡рдЯ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдереА рдХрд┐ рдХрд░реНрдиреЗрд▓ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдорд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрдмрдХрд┐ kthreadd_task рдЕрднреА рднреА NULL рдерд╛ред рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, IRQF_NO_THREAD рдзреНрд╡рдЬ, рдЬреЛ рдХрд┐ рдЯрд╛рдЗрдорд░ hr-time-rtc.c



рдлреНрд▓реИрдЧ рдлреНрд▓реИрдЧ рдХреЛ hr-time-rtc.c



рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд╣реБрд░реНрд░реЗ! рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрдд рд╣реИ ...



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рдерд╛ рдХрд┐ рдСрдбрд┐рдпреЛ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдирдП рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ PREEMPT RT рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдХреЗрд╡рд▓ SLAB рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рддрдВрддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 3.0.8 рдореЗрдВ), рдФрд░ рд╢реБрд░реВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ SLUB рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдирдП рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдмрд╣реБрдд рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╛рд╕реНрдкрд░рд╕реНрдХреА рд▓реИрдм рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХреЛ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рд╣реЗрдХреНрд╕-рд░реЗрдЬ рдбрд┐рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдореЗрд░реЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ рдФрд░ рдХреЛрдбрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрдШрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреА рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЙрдирдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрди: рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдСрдбрд┐рдпреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ "рдирдП" рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, WM8960 рдорд╛рдЗрдХреНрд░реЛрдХреНрд░реЗрдХрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рдЕрдВрддрд░реЛрдВ рдХреЗ рдХрд╛рд░рдг, рдзреНрд╡рдирд┐ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ рдЧрдпрд╛ рдерд╛ред рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЯреНрд╡реАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЪреБрдирд╛ - рдореИрдВрдиреЗ рдЪреАрдиреА рдХрдВрдкрдиреА рдПрдВрдмреЗрдбрд╕реНрдХреА рдЯреЗрдХ рднреЗрдЬрд╛, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдПрдХ рдорд┐рдиреА-рдХрдВрдкреНрдпреВрдЯрд░ рдЦрд░реАрджрд╛, PREEMPT_RT рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдкреИрдЪ рдЦрд░реАрджрд╛, рдФрд░ рдЙрдирд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдлрд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рд▓реЛрдЧреЛрдВ рдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдзреНрд╡рдирд┐ рдиреЗ рдЕрдВрддрддрдГ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛ред



рд╡реИрд╕реЗ, рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдШрдЯрд┐рдд рдЪрд╛рд▓рдХ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рдерд╛, рддреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ kgdb рдбрд┐рдмрдЧрд░ рдореЗрд░реЗ рдпрд╛ рдореВрд▓ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреЛрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕реИрдорд╕рдВрдЧ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ ( drivers/tty/serial/samsung.c



) рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕ рдкреИрдЪ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдбрд┐рдмрдЧрд░ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред



рдЖрдЧреЗ рдХреА рдЦреБрджрд╛рдИред рдирдП рдХреЛрд░ рдХрд╛ рджреВрд╕рд░рд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдЕрддреНрдпрдВрдд рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реЗ "рд▓реИрдЧреНрд╕" рдХреЗ рд╕рд╛рде S5PV210 рдЪрд┐рдк рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рднреА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрддрд┐ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдЕрд╕рдВрднрд╡ рдерд╛, рдФрд░ рдПрд╡реАрдЖрд░ рдирд┐рдпрдВрддреНрд░рдХ рдЪрдордХрддреА рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреЛрд▓рд┐рдВрдЧ рдХреАрдмреЛрд░реНрдб рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░рдг рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдпрд╣ рджреЗрдЦрд╛ рдХрд┐ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдХрдИ рдорд┐рд▓рд┐рдпрди рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреА рдкреАрдврд╝реА рдмрд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИ - рдХрд░реНрдиреЗрд▓ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдерд╛ред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ IRQF_NO_THREAD рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рд╕рднреА рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдиреЙрди-рдереНрд░реЗрдбреЗрдб рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ serial_core.c



, рдХреНрдпреЛрдВрдХрд┐ рд╕реИрдорд╕рдВрдЧ рдЪрд╛рд▓рдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ serial_core.c



рдФрд░ serial_core.h



рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рд╕реЗ рд╕рднреА рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдПред рдХреНрдпреЛрдВрдХрд┐ PREEMPT RT рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдореЗрдВ NO_THREAD рд╡рд╛рд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдореЗрдВ spin_lock_t рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ raw_spinlock_t рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдореВрд▓ рдХрд░реНрдиреЗрд▓ рдореЗрдВ, рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рдерд╛, рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдзреАрдп рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЛрдбреЗрдХреНрд╕, рдПрдЪрдбреАрдПрдордЖрдИ, рдЖрджрд┐, 512 рдПрдордмреА рд░реИрдо рдореЗрдВ рд╕реЗ, рдХреЗрд╡рд▓ 390 рдПрдордмреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдереЗ, рдФрд░ рд╢реЗрд╖ рдЙрдкрд░реЛрдХреНрдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рдерд╛ред , рдФрд░ рд╣рдореЗрд╢рд╛ (рднрд▓реЗ рд╣реА рд╡реЗ рдХрд░реНрдиреЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЕрдХреНрд╖рдо рдереЗ)ред рдпрд╣ рдмрд╣реБрдд рд╣реА рдмреЗрдХрд╛рд░ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд 120 рдПрдордмреА рд░реИрдо рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдирдореВрдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореЗрдореЛрд░реА рдХреЛ рдлрд╝рд╛рдЗрд▓ arch/arm/mach-s5pv210/mach-tq210.c



рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╢реАрди (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреЛрд░реНрдб) рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИред рд╣рдо рд╕реНрдореГрддрд┐ рдХреЗ рдЖрд╡рдВрдЯрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВ - s5p_reserve_bootmem



рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 120 рдПрдордмреА рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдорд┐рд▓рддреА рд╣реИред



рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдмрдлрд░ рдЖрдХрд╛рд░ рдХрд╛ рд╕рдВрдмрдВрдз рдерд╛, рдЬреЛ рдореВрд▓ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдкреГрд╖реНрда рдХреЗ рдмрд░рд╛рдмрд░ рдерд╛, рдЬреЛ 44100 рд╣рд░реНрдЯреНрдЬ рдХреА рдПрдХ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдкрд░, 16 рдмрд┐рдЯреНрд╕ рдХреЗ 2 рдЪреИрдирд▓реЛрдВ рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд▓рдЧрднрдЧ 20 рдПрдордПрд╕ - рдереЛрдбрд╝рд╛ рд╕рд╛ рджрд┐рдпрд╛ред рдпрд╣ рдорд╛рди рдлрд╝рд╛рдЗрд▓ sound/soc/samsung/dma.c



рдореЗрдВ 128 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдиреНрдпреВрдирддрдо рдмрдлрд░ рдЖрдХрд╛рд░ рдХреБрдЫ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рддрдХ рдХрдо рд╣реЛ рдЧрдпрд╛ рдерд╛ред



PREEMPT RT рдФрд░ GitHub рдкрд░ рд╕рднреА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб



AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ LinuxSampler рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ


AVR рдорд┐рдиреА-рдХрдВрдкреНрдпреВрдЯрд░ рдмреЛрд░реНрдб рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ UART рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдорд┐рдбреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдСрдбрд┐рдпреЛ рдФрд░ рдорд┐рдбреА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП JACK рд╕рд░реНрд╡рд░ рдХреЛ рдкрд░рд┐рд╡рд╣рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред C рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ, JACK рдореЗрдВ MIDI-OUT рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рд╛рдкреНрдд MIDI рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ JACK рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╣реА LinuxSampler рдореЗрдВ рдбрд┐рд▓реАрд╡рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред рд╕рд╕реНрддрд╛ рдФрд░ рд╣рдВрд╕рдореБрдЦред



рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдмрдВрджрд░рдЧрд╛рд╣ рдФрд░ JACK рдХреЗ рдмреАрдЪ рдкреБрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/time.h> #include <unistd.h> #include <assert.h> #include <string.h> #include <sysexits.h> #include <errno.h> #include <signal.h> #include <fcntl.h> #include <termios.h> #include <jack/jack.h> #include <jack/midiport.h> #define UART_SPEED B9600 jack_port_t *output_port; jack_client_t *jack_client = NULL; int input_fd; void init_serial(int fd) { struct termios termios; int res; res = tcgetattr (fd, &termios); if (res < 0) { fprintf (stderr, "Termios get error: %s\n", strerror(errno)); exit (EXIT_FAILURE); } cfsetispeed (&termios, UART_SPEED); cfsetospeed (&termios, UART_SPEED); termios.c_iflag &= ~(IGNPAR | IXON | IXOFF); termios.c_iflag |= IGNPAR; termios.c_cflag &= ~(CSIZE | PARENB | CSTOPB | CREAD | CLOCAL); termios.c_cflag |= CS8; termios.c_cflag |= CREAD; termios.c_cflag |= CLOCAL; termios.c_lflag &= ~(ICANON | ECHO); termios.c_cc[VMIN] = 3; termios.c_cc[VTIME] = 0; res = tcsetattr (fd, TCSANOW, &termios); if (res < 0) { fprintf (stderr, "Termios set error: %s\n", strerror(errno)); exit (EXIT_FAILURE); } } double get_time(void) { double seconds; int ret; struct timeval tv; ret = gettimeofday(&tv, NULL); if (ret) { perror("gettimeofday"); exit(EX_OSERR); } seconds = tv.tv_sec + tv.tv_usec / 1000000.0; return seconds; } double get_delta_time(void) { static double previously = -1.0; double now; double delta; now = get_time(); if (previously == -1.0) { previously = now; return 0; } delta = now - previously; previously = now; assert(delta >= 0.0); return delta; } static double nframes_to_ms(jack_nframes_t nframes) { jack_nframes_t sr; sr = jack_get_sample_rate(jack_client); assert(sr > 0); return (nframes * 1000.0) / (double)sr; } static double nframes_to_seconds(jack_nframes_t nframes) { return nframes_to_ms(nframes) / 1000.0; } static jack_nframes_t ms_to_nframes(double ms) { jack_nframes_t sr; sr = jack_get_sample_rate(jack_client); assert(sr > 0); return ((double)sr * ms) / 1000.0; } static jack_nframes_t seconds_to_nframes(double seconds) { return ms_to_nframes(seconds * 1000.0); } static void process_midi_output(jack_nframes_t nframes) { int t, res; void *port_buffer; char midi_buffer[3]; jack_nframes_t last_frame_time; port_buffer = jack_port_get_buffer(output_port, nframes); if (port_buffer == NULL) { printf("jack_port_get_buffer failed, cannot send anything.\n"); return; } jack_midi_clear_buffer(port_buffer); last_frame_time = jack_last_frame_time(jack_client); t = seconds_to_nframes(get_delta_time()); res = read(input_fd, midi_buffer, sizeof(midi_buffer)); if (res < 0 && errno == EAGAIN) return; res = jack_midi_event_write(port_buffer, t, midi_buffer, 3); if (res != 0) { printf("jack_midi_event_write failed, NOTE LOST."); } } static int process_callback(jack_nframes_t nframes, void *notused) { if (nframes <= 0) { printf("Process callback called with nframes = 0; bug in JACK?"); return 0; } process_midi_output(nframes); return 0; } int connect_to_input_port(const char *port) { int ret; ret = jack_port_disconnect(jack_client, output_port); if (ret) { printf("Cannot disconnect MIDI port."); return -3; } ret = jack_connect(jack_client, jack_port_name(output_port), port); if (ret) { printf("Cannot connect to %s.", port); return -4; } printf("Connected to %s.", port); return 0; } static void init_jack(void) { int i, err; jack_client = jack_client_open("midibridge", JackNullOption, NULL); if (jack_client == NULL) { printf("Could not connect to the JACK server; run jackd first?"); exit(EXIT_FAILURE); } err = jack_set_process_callback(jack_client, process_callback, 0); if (err) { printf("Could not register JACK process callback."); exit(EXIT_FAILURE); } char port_name[32]; snprintf(port_name, sizeof(port_name), "midi_out"); output_port = jack_port_register(jack_client, port_name, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); if (output_port == NULL) { printf("Could not register JACK output port '%s'.", port_name); exit(EXIT_FAILURE); } if (jack_activate(jack_client)) { printf("Cannot activate JACK client."); exit(EXIT_FAILURE); } } static void usage(void) { fprintf(stderr, "usage: midibridge -a <input port>\n"); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int ch; char *autoconnect_port_name = NULL; while ((ch = getopt(argc, argv, "a:")) != -1) { switch (ch) { case 'a': autoconnect_port_name = strdup(optarg); break; default: usage(); } } input_fd = open("/dev/ttySAC1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); if (input_fd < 0) { fprintf(stderr, "Cannot open serial port %s\n", strerror(errno)); return EXIT_FAILURE; } init_serial (input_fd); init_jack(); if (autoconnect_port_name) { if (connect_to_input_port(autoconnect_port_name)) { printf("Couldn't connect to '%s', exiting.", autoconnect_port_name); exit(EXIT_FAILURE); } } getc(stdin); return 0; }
      
      









рдпрд╣ рд╕рдорд╛рдзрд╛рди jack-smf-player



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ jack-smf-player



рдорд╛рдзреНрдпрдо рд╕реЗ рдорд┐рдбреА рдлрд╛рдЗрд▓реЗрдВ рдЦреЗрд▓рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдПрдЖрд░рдПрдо рдФрд░ рдбрдмреНрд▓реНрдпреВрдПрд╡реА / рдПрдордкреА 3 рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП jack-smf-player



рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде mplayer рджреНрд╡рд╛рд░рд╛ред



рдмреЛрдирд╕


рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдкрд░ nefelim4ag рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдХрд╛рдореЗрдЪреНрдЫрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ - рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддрдВрдмреВрд░рд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдиреГрддреНрдпреЛрдВ рдХреЗ рдмрд╛рдж, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рд╡рд┐рд╡рд░рдг, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдЕрдм рдпрд╛рдж рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓рд┐рдмрд╛рдпрдмреНрд░рд┐рдмрд┐рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдФрд░ рдУрдкрди 5 рдИрдПрд╕ 2.0, рдИрдЬреАрдПрд▓рдПрдлрдПрд╕ рдФрд░ рдХреНрдпреВрдЯреА рдХреНрд╡рд┐рдХ 2.0 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреНрдпреВрдЯреА 5 рдФрд░ рдкрд╛рдпрдХреНрдпреВрдЯреА 5 рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред рдЕрдм рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Qt рдХреНрд╡рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб 4.0 рдХреЗ рддрд╣рдд рдирд╡реАрдирддрдо рдлреИрд╢рди рдЯреНрд░реЗрдВрдбреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рджрд┐рдЦрддрд╛ рд╣реИ ред







рдЕрдВрдд рдореЗрдВ


рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдСрдбрд┐рдпреЛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдЕрдм рдЕрд░реНрдз-рд╕реЙрд░реНрдЯреЗрдб рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реИред рд╡реАрдбрд┐рдпреЛ рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рд╕рдВрднрд╡рддрдГ рдЕрдЧрд╕реНрдд рдореЗрдВ рдкреИрджрд╛ рд╣реЛрдЧрд╛, рдЪреАрди рдореЗрдВ рдорджрд░рдмреЛрд░реНрдб рдХреЗ рдЖрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХрд░реНрдиреЗрд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди PyQt5 рдФрд░ QtQuick рдкрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднрд╛рдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░рджрд░реНрд╢рди



рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ:

рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЧрдП рд╕рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ
  • alsa-рд▓рд┐рдм-1.0.27.2
  • alsa-utils-1.0.27.2
  • libaudiofile-0.3.6
  • dbus-1.8.0
  • dropbear-2014.63
  • FFTW-3.3.3
  • fluidsynth-1.1.6
  • fontconfig-2.11.0
  • freetype-2.5.3
  • рдЪрд┐рдХрдирд╛-2.34.3
  • libicu-52.1
  • рдЬреИрдХ рдСрдбрд┐рдпреЛ-рдХрдиреЗрдХреНрд╢рди рдХрд┐рдЯ-0.121.3
  • рдЬреИрдХ smf-utils-1.0
  • libffi-3.0.13
  • libgig-3.3.0
  • libgig-SVN
  • libhybris
  • libsamplerate-0.1.8
  • libsndfile-1.0.25
  • linuxsampler-1.0.0
  • linuxsampler-SVN
  • mplayer SVN-r36900-4.4.6
  • openssl-1.0.0l
  • psutil-1.2.1
  • pyjack-0.5.2
  • PyQt-рдЬреАрдкреАрдПрд▓-5.2
  • pyserial-2.7
  • рдкрд╛рдпрдерди 2.7.6
  • strace-4.8
  • tslib-1.4.1




рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рд╕реВрдЪреА рд╕реЗ рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░реВрдБрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдЕрдиреНрдп рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рдЬрд┐рд╕реЗ рдлреНрд░реЗрдВрдбрд▓реАрдо рдЯрд┐рдиреАрдл210 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрд╕ 5 рдкреА рд╡реА 212 рдХреЗ рдПрдХ рд╣реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░, рд╢рд╛рдпрдж, рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред



All Articles