
рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп Khabrovitesред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ STM32F103 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд░рд▓ USB рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдФрд░ ILI9325 рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдЪреАрдиреА рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ред
рд╣рдордиреЗ рдЗрд╕реЗ LibUSB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЦреИрд░, рдЕрдм рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдЦреЗрдВ, рдЬреЛ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ред рд╣рдо рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ OpenWRT рд╕реНрд░реЛрдд рдкреЗрдбрд╝ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдЕрдиреНрдп рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╣рд╛рдВ рдмрд╕ рдЬрд╛рдПрдЧрд╛ред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд░рд┐рдЪрдп
рдЪреВрдБрдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдирд╣реАрдВ рдмрджрд▓реЗ рд╣реИрдВ, рд╣рдо рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣
рд▓рд┐рдирдХреНрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реНрд╕ рдмреБрдХ рд╣реИ , рдЬреЛ рд▓рд┐рдирдХреНрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдмрд╛рдд, рдореИрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╣рдорд╛рд░реЗ рд░рд╛рдЙрдЯрд░ рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛
рд▓реЗрдЦ рдкрдврд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ - рдПрдХ
рдмрд╣реБрдд, рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╕рдВрд╕рд╛рдзрди , рдЙрдирдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдорд┐рдирд╛рд░реЛрдВ рд╕реЗ рдкреНрд░рд╕реНрддреБрддрд┐рдпрд╛рдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рд╣рд╛рдВ, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╡рд┐рддрд░рдг рдХрд┐рдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдЯрдХрд╕рд╛рд▓ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рд╡рд┐рддрд░рдг рдХрд┐рдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрдерд╛рдкрдирд╛ рдХрдорд╛рдВрдб рд╣реИрдВред
рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреЛ рдХреЛрдИ рднреА рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рд╡рд╣ рддреБрд░рдВрдд рдЗрди рд╕рдорд╛рди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рджреЛ рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ - рдЪрд░рд┐рддреНрд░ рдФрд░ рдмреНрд▓реЙрдХред рдпрд╣ рд╢рд╛рдпрдж рдкрд╣рд▓реА рдмрд╛рдд рд╣реИ рдЬреЛ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрднреА рднреА рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдЕрд▓рдЧ рд╕реЗ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреВрд░реА рддрд╕реНрд╡реАрд░ рд╣рд░ рдЬрдЧрд╣ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рдХрдИ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реАрдзреЗ рдЪрд░рд┐рддреНрд░ рдпрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖
рдврд╛рдВрдЪреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреНрд░реЗрдордмрдлрд╝рд░, рдЗрдирдкреБрдЯ, рдЯреНрдЯреА, рдЖрджрд┐ред рдлреНрд░реЗрдорд╡рд░реНрдХ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рдлреНрд░реЗрдордмрдлрд╝рд░ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛, рд╣рдореЗрдВ рдЕрдм рд╕рд┐рд╕реНрдЯрдо рдХреЛ "рджреЗрдЦреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реИ" рдмрддрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдХрд╛рдо рд╣реИ, рдФрд░ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░) рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдПрдХ рдлреНрд░реЗрдо рдмрдлрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рддреБрд░рдВрдд рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдпреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрд╕реЛрд▓ рдбреНрд░рд╛рдЗрд╡рд░ (fbcon) рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреНрд░реЗрдо-рдмрдлрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЛ рд░рдВрдЧреАрди рдЯреЗрдХреНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЗрд╕ рдЬрдВрдЧрд▓ рдореЗрдВ рдЬрд▓реНрджреА рдордд рдХрд░реЛ рдФрд░ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдБ, рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдордмрдлрд╝рд░ рдбреНрд░рд╛рдЗрд╡рд░ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЙрд╕реА рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдХреИрд░реЗрдХреНрдЯрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрдм рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рд╕реЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдорд╛рд░реЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдЧрд╛ (рдлрд╛рдЗрд▓ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛) рдФрд░ рдЗрд╕реЗ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗрдВред
рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рддреИрдпрд╛рд░ рдХрд░рдирд╛
рдЪрд╛рд▓рдХ рд╕реНрд╡рдпрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рд╕реНрд░реЛрдд рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рд╣реЗрд▓реЛрд╡рд░реНрд▓реНрдб рдбреНрд░рд╛рдЗрд╡рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓#include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ #include <linux/init.h> /* Needed for the macros */ #define DRIVER_AUTHOR "Amon-Ra" #define DRIVER_DESC "USB STM32-based LCD module driver" static int __init lcddriver_init(void) { printk(KERN_INFO "Hello, world!\n"); return 0; } static void __exit lcddriver_exit(void) { printk(KERN_INFO "Goodbye, world!\n"); } module_init(lcddriver_init); module_exit(lcddriver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC);
рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рд╣реИ - рд╣рдо рджреЛ рдХреЙрд▓рдмреИрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рддрдм рдХрд╣рддреЗ рд╣реИрдВ рдЬрдм рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЗрд╕реЗ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ usblcd.c рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред
рдЕрдм рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдорд╛рд░реЗ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдгрд╛рд▓реА рдЖрдо рддреМрд░ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдЙрддреНрдкрд╛рдж рд╣реИ, рдЬрд┐рд╕реЗ BuildRoot рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИ: рдпрд╣ рдХреНрд░реЙрд╕-рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЯреВрд▓рдЪреИрди рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХрд░реНрдиреЗрд▓ рдФрд░ рддреГрддреАрдп-рдкрдХреНрд╖ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдкреИрдЪ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ, рд╕рдВрдХреБрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рдкреИрдХ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рдХреЛрдбрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреНрдпрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд░реНрдиреЗрд▓ (рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ) рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╣рд░ рдмрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрддреНрдкрдиреНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЗрдХрд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рдорд╛рдирдХ рдЫрд╡рд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдиреВ рдореЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдореЗрдиреБрдХреЛрдирдлрд┐рдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд╕реЗрдЯрд┐рдВрдЧ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрдзрд╛рд░ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХреЙрд▓ рдХрд░реЗрдВ
kernel_menuconfig ред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рд▓рдХреНрд╖реНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ, рдФрд░ рдЖрдк рдХреЗрд╡рд▓ рдлрд┐рд░ рд╕реЗ рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдХреЗрд╡рд▓ рд╕реНрд╡рдЪреНрдЫ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрд╛рд▓реВ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдмрдВрдж рд╣реИ!
рд╕рдЪ рд╣реИ, рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдм рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдореЗрдХрдлрд╛рдЗрд▓ (рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдореЙрдбреНрдпреВрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ) рдФрд░ рдХреЛрдВрдХрдлрд┐рдЧ (рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрдиреВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ)
kernel_menuconfig рдФрд░ рдЬрд┐рд╕рдореЗрдВ
рдореЗрдХрдлрд╛рдЗрд▓ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ) рд╕реЗ рдмрдирд╛ - рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд╣рдореЗрдВ рдореЗрдиреВ рдореЗрдВ рдЕрдкрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ usblcd.c рдХреЛ рд▓рд┐рдирдХреНрд╕ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде
/ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ / рд╡реАрдбрд┐рдпреЛ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рд╕рдордп рд╕рдордЭрдиреА рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рд╣реИ
рдЯрд╛рд░реНрдЧреЗрдЯ / рд▓рд╛рдЗрдирдХреНрд╕ / <рд▓рдХреНрд╖реНрдп> / рдореЗрдВ рдкрдбрд╝реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЛрд░реНрд╕ рдЯреНрд░реА рдХреА рдЯрд╛рд░рдЧреЗрдЯ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреА рдкреАрдврд╝реАредрдмрд┐рд▓реНрдбрд░реЛрдЯ рд╕реНрд╡рдЪреНрдЫ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ
build_dir / <рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛> / <рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо> / linux- <рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг> рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж,
рд▓рдХреНрд╖реНрдп / рд▓рд╛рдЗрдирдХреНрд╕ / <рд▓рдХреНрд╖реНрдп> / рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд╛рд▓реА рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЖрдорддреМрд░ рдкрд░, рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдФрд░ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж,
рд▓рдХреНрд╖реНрдп / рд▓рд╛рдЗрдирдХреНрд╕ / <рд▓рдХреНрд╖реНрдп> / рдкреИрдЪ рдореЗрдВ рд╕реНрдерд┐рдд рдкреИрдЪ рд╕реЗрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдкреИрдЪ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдореЗрдХрдлрд╛рдЗрд▓ рдФрд░ рдХреЛрдиреНрдХрдлрд┐рдЧ рдХреЗ рд▓рд┐рдП рдРрдб-рдСрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рд▓рдХреНрд╖реНрдп / рд▓рд┐рдирдХреНрд╕ / рдЬреАрдирдЧрд┐рдХ рд╕реЗ рдкреИрдЪ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рддреЗрдЬ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдХрд░реНрдиреЗрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ build_dir рдореЗрдВ рдХреНрдпрд╛ рдирд┐рд╣рд┐рдд рд╣реИ, рдЗрд╕рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЕрдм рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдВрджреБ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╣реИ, рдФрд░ usblcd.c рд░рдЦрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред
- рд╣рдо рд▓рдХреНрд╖реНрдп / linux / ar71xx / files / рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ mkdir рд╡реАрдбрд┐рдпреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ ред Buildroot рд╕реНрд░реЛрдд рдЯреНрд░реА рдХреА рд╕рдВрдЧрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдирдП рдмрдирд╛рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ usblcd.c рдлрд╝рд╛рдЗрд▓ рдбрд╛рд▓рддреЗ рд╣реИрдВред
- рд▓рдХреНрд╖реНрдп / linux / ar71xx / рдореЙрдбреНрдпреВрд▓.mk рдореЗрдВ рд╣рдо рдирдП рдХрд░реНрдиреЗрд▓ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд░реНрдиреЗрд▓ рдкреИрдХреЗрдЬ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдХрд░реНрдиреЗрд▓ рдкреИрдХреЗрдЬ OpenWRT рдореЗрдВ рдУрдкрдХрд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдкреИрдХреЗрдЬ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЫрд╡рд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ - рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдмрд╛рдЗрдирд░реА рд╣реИ, рддреЛ рд╣рдо рдпрд╛ рддреЛ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдзрдХреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд┐рдХрд▓реНрдк рдПрдо рдореЗрдиреБрдХреЛрдирдлрд┐рдЧ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк), рдЗрд╕реЗ рдмрдВрдбрд▓ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдирд┐рд░реНрдорд╛рдгрд╛рдзреАрди рдЗрдореЗрдЬ рдХреЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡-рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдпрд╣ рдмрд╛рдЗрдирд░реА рдПрдХ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рд╣реИ, рддреЛ, рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЖрдк рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓_рдореЗрдиреНрдпреВрдХреЛрдлрд┐рдЧ (рдпрд╛ рдЗрди рдХрд░реНрдиреЗрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣, рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ, рдХреБрдЫ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдПрдХ рдкреИрдХреЗрдЬ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд╕рдордЭ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рдПрдлрдПрд╕ рдореЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдореЗрдиреНрдпреВрдХреЛрдлрд┐рдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗред
Mod.mk рдХреЛ рд▓рд┐рдЦрдирд╛ define KernelPackage/usb-lcd SUBMENU:=$(USB_MENU) TITLE:=USB STM32-based LCD module DEPENDS:=@TARGET_ar71xx KCONFIG:=CONFIG_STM32_USB_LCD FILES:=$(LINUX_DIR)/drivers/video/usblcd.ko endef define KernelPackage/usb-lcd/description Kernel module for USB STM32-based LCD module. endef $(eval $(call KernelPackage,usb-lcd))
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдореЗрдиреБрдХреЛрдирдлрд┐рдЧ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рд╣реИрдВ - рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреИрдХреЗрдЬ USB рд╕рдмрдореЗрдиреВ рдореЗрдВ рд╣реЛрдЧрд╛, рдЬреЛ рд╣рдо рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, AR71xx- рдЖрдзрд╛рд░рд┐рдд рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдХрд░реНрдиреЗрд▓ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реЗ CONFIG_STM32_USB_LCD рдХрд╣реЗрдВред
рдлрд┐рд░ рдлрд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЖрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ - рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ usblcd.ko рдмрди рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдлрд┐рд░ рд╣рдо рд╡рд┐рд╡рд░рдг рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕рднреА рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВред
- OpenWRT рдХреА рдЬрдбрд╝ рд╕реЗ рд╣рдо рдореЗрдиреБрдХреЛрдирдлрд┐рдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ / рдпреВрдПрд╕рдмреА рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рддреЗ рд╕рдордп CONFIG_STM32_USB_LCD рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЕрд░реНрде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ <рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ> / рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ / рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдХреЛрдиреНрдХрдлрд┐рдЧ рдФрд░ рдореЗрдХрдлрд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП build_dir рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рд╣рд░ рдмрд╛рд░ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рд╣реЛрддреА рд╣реИред рд╕рд╣реА рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЛрд░реНрдб-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЪ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ / рд▓рдХреНрд╖реНрдп / рд▓рд┐рдирдХреНрд╕ / ar71xx / рдкреИрдЪ рдореЗрдВ рд░рдЦреЗрдВ ред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд░рдЬрд╛рдИ рдЪрд╛рд╣рд┐рдП - рдкреИрдЪ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реАред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХреА.рдУрдкрдирдбрдмреНрд▓реНрдпреВрдЖрд░рдЯреА рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд░рдЬрд╛рдИ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (sudo apt-get install рд░рдЬрд╛рдИ) рдФрд░ рдЗрд╕реЗ рд╡рд┐рдХреА рд▓реЗрдЦ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:
cat > ~/.quiltrc <<EOF QUILT_DIFF_ARGS="--no-timestamps --no-index -pab --color=auto" QUILT_REFRESH_ARGS="--no-timestamps --no-index -pab" QUILT_PATCH_OPTS="--unified" QUILT_DIFF_OPTS="-p" EDITOR="nano" EOF
- рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
make target/linux/{clean,prepare} V=s QUILT=1
рд╡рд╣ рд╣рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП build_dir рдореЗрдВ рд╕реНрд░реЛрдд рдкреЗрдбрд╝ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред
- Build_dir рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдВред рд╕рдВрд╕реНрдХрд░рдг рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрде рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрди рд╕рднреА рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИрдВред
cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.6.9/ quilt push тАУa
- рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдЪ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рдпрдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ - рдпрд╣ рдПрдХ рдРрд╕реЗ рдирдВрдмрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореМрдЬреВрджрд╛ рдкреИрдЪ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рд╕реЗ рднреА рдмрдбрд╝рд╛ рд╣реЛ - рдпрд╣ рдЙрд╕ рдХреНрд░рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрдЪ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреМрди рд╕реЗ рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рд░рдЬрд╛рдИ рд╕реАрд░реАрдЬрд╝ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЪ рд╡рд╛рд▓реА рдПрдХ рдмрдбрд╝реА-рдмрдбрд╝реА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдкреИрдЪ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдЧрд╛, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо / xxx- <name> .patch рдХреЛ рджреЗрдЦреЗрдВ ред рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕рдВрд╢реЛрдзрди рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдПрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо / a06-rb750_nand-add-рдмрдлрд░-рд╡реЗрд░реАрдлрд┐рдХреЗрд╢рди.рдЪреИрдЪ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ b00 рд▓реЗрддреЗ рд╣реИрдВред
рд╣рдо рдЕрдорд▓ рдХрд░рддреЗ рд╣реИрдВ
quilt new platform/b00-usb-lcd.patch
- рд╣рдо kilt рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рд╣рдо рдкреИрдЪ рдХрд░реЗрдВрдЧреЗ:
quilt add drivers/video/Kconfig quilt add drivers/video/Makefile
- рд╕рдВрдкрд╛рджрди рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЖрдЗрдП Kconfig рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдиреВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдЕрднреА рддрдХ рдПрдХ "рдИрдорд╛рдирджрд╛рд░" рдлреНрд░реЗрдордмрдлрд╝рд░ рдбреНрд░рд╛рдЗрд╡рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд░реВрдЯ рдкрд░, рдЕрд░реНрдерд╛рддреН рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
menuconfig fb
tristate "рдлреНрд░реЗрдо рдмрдлрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди"
рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
config STM32_USB_LCD tristate "USB STM32-based LCD module support" help Simple USB STM32-based LCD module driver
рдпрд╣ рдбреНрд░рд╛рдЗрд╡рд░ - рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдкреЛрд░реНрдЯ рдореЗрдиреВ рдореЗрдВ рд╕реНрдерд┐рдд рдХрд░реНрдиреЗрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдиреВ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЖрдЗрдЯрдо рдкреЗрд╢ рдХрд░реЗрдЧрд╛ред
рдЕрдм Makefile рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, # рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдЬреЛрдбрд╝ рджреЗрдВ
obj-$(CONFIG_STM32_USB_LCD) += usblcd.o
рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЪрдпрдирд┐рдд рдирд╣реАрдВ рд╣реИред
- рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд░рдЬрд╛рдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдорд╛рдВрдб рдЬрд╛рд░реА рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреИрдЪ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо рд░рдЬрд╛рдИ рддрд╛рдЬрд╝рд╛ рдХрд╣рддреЗ рд╣реИрдВ, рдкреНрд░рд╛рдкреНрдд рдкреИрдЪ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рдмрд╛рджред
- рдмрд┐рд▓реНрдбрд░реБрдЯ рдХреЗ рд░реВрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдХрд╣реЗрдВ рдХрд┐ рдЯрд╛рд░рдЧреЗрдЯ / рд▓рд╛рдЗрдирдХреНрд╕ / рдЕрдкрдбреЗрдЯ V = s рдХрд░реЗрдВ
рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЕрдВрддрд┐рдо рд▓рд╛рдЗрдиреЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдВрдЧреА
' -рд╕рдм-рдПрд▓рд╕реАрдбреА тАЩ
- рд╣рдо рдХрдорд╛рдВрдб рдХреЛ рдХреНрд▓реАрди рдПрдВрдб& рдореЗрдХ рдмрдирд╛рддреЗ рд╣реИрдВ , рдлрд╝рд░реНрдорд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдореЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВ , рдЗрд╕реЗ рд░рд╛рдЙрдЯрд░ (/ tmp рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдФрд░ рд░рд┐рдлрд▓реИрд╢ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ mtd рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ sysupgrad рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИ - рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЕрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ / рдЖрджрд┐ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╕реНрд╡рд┐рдЪ -c):
scp bin/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-sy supgrade.bin root@192.168.0.48:/tmp sysupgrade -c openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-sy supgrade.bin
- рд╣рдо SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЙрдЯрд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ / lib / рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ - рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдиреНрдп рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣рдорд╛рд░рд╛ usblcd.ko рд╣реЛрдЧрд╛
Insmod usblcd && rmmod usblcd рдЪрд▓рд╛рдПрдБ
рдХреБрдЫ рднреА рдирд╣реАрдВ рдЧрд┐рд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо dmesg рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдФрд░ рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдирд╡реАрдирддрдо рдкреЛрд╕реНрдЯреЛрдВ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
[реи реп рез.ремрейрежрежрежреж] рдирдорд╕реНрдХрд╛рд░, рджреБрдирд┐рдпрд╛!
[реи реп рез.ремрекрежрежрежреж] рдЕрд▓рд╡рд┐рджрд╛, рджреБрдирд┐рдпрд╛!
рдмрдзрд╛рдИ, рдореЙрдбреНрдпреВрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрдХрдЯреНрдард╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреВрд░реА рдЫрд╡рд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рд░рд╛рдЙрдЯрд░ рдХреЛ рд╣рд░ рдмрд╛рд░ рд░реА-рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмрд╕ рдпрд╣ рдХрд╣реЗрдВ
рдХрд┐ рдХреНрд▓реАрди && рдореЗрдХ рдЯрд╛рд░рдЧреЗрдЯ / рдХрдВрдкрд╛рдЗрд▓ рдмрдирд╛рдПрдВ , рдЬреЛ рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрд╕реАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдЖрдк рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдбреНрд░рд╛рдЗрд╡рд░
рдпрд╣рд╛рдБ, рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП usb-skeleton рдирд╛рдордХ рд╕реЛрд░реНрд╕ рдХреЛрдб, рдЬрд┐рд╕реЗ
рдпрд╣рд╛рдБ рдСрдирд▓рд╛рдЗрди рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ, рд╣рдорд╛рд░реА рдмрд╣реБрдд рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм Google рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ
рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП USB рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо usb_device_id рддрд╛рд▓рд┐рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
static struct usb_device_id lcd_table[]={ {USB_DEVICE(DEVICE_VENDOR_ID, DEVICE_PRODUCT_ID)}, { } };
рдпрд╣рд╛рдВ DEVICE_VENDOR_ID рдФрд░ DEVICE_PRODUCT_ID рдкрд░рд┐рднрд╛рд╖рд┐рдд VID рдФрд░ PID рд╕рдорд╛рди рд╣реИрдВ, рдХреНрд░рдорд╢рдГ, 0xDEAD рдФрд░ 0xF00D - рд╣рдорд╛рд░реЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рдорд╛рди рд╣реИрдВред
- рдШреЛрд╖рдгрд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдо рдореИрдХреНрд░реЛ рдХрд╣рддреЗ рд╣реИрдВ
MODULE_DEVICE_TABLE (usb, lcd_table);
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
- рдХреЙрд▓рдмреИрдХ рдХреА рдШреЛрд╖рдгрд╛
рд╢реВрдиреНрдп LCDProbe (рд╕реНрдЯреНрд░рдХреНрдЪрд░ usb_interface * рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдХрд╛рд╕реНрдЯ рд╕реНрдЯреНрд░рдХреНрдЪрд░ usb_device_id * id)
рдФрд░
рд╢реВрдиреНрдп LCDDisconnect (рд╕реНрдЯреНрд░рдХреНрдЪрд░ usb_interface * рдЗрдВрдЯрд░рдлрд╝реЗрд╕)
рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХрдиреЗрдХреНрдЯ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рджреЗрдВред
- рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
Usb_driver рд╕рдВрд░рдЪрдирд╛ struct usb_driver usblcd_driver={ .owner = THIS_MODULE, .name = "usblcd", .probe = LCDProbe, .disconnect = LCDDisconnect, .id_table = lcd_table, };
- рдЖрдорддреМрд░ рдкрд░, рдПрдХ рдирдпрд╛ USB рдбреНрд░рд╛рдЗрд╡рд░ рдореЙрдбреНрдпреВрд▓_init рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЙрдбреНрдпреВрд▓_рдПрдХреНрд╕рд┐рдЯ рдореЗрдВ deregistered рд╣реЛрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЗрди рджреЛ рдХреЙрд▓рдмреИрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдбреАрдЗрдирд░рд╛рдЗрдЬреЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╡реЗ рдореИрдХреНрд░реЛ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЛрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред usb_register (...) рдФрд░ usb_deregister (...) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛, рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд / deregistering рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рднреА рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
module_usb_driver(usblcd_driver);
рдпрд╣ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рд╣рдо рдЬреЛ рдХреБрдЫ рднреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рд╣рдо рдХрдорд╛рдВрдб
рдХреЛ рд╕реНрд╡рдЪреНрдЫ рдФрд░ & lt; рд▓рдХреНрд╖реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ / V = тАЛтАЛs рдмрдирд╛рддреЗ рд╣реИрдВ , рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкрд░рд┐рдгрд╛рдореА usblcd.ko рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВред
рдЕрдм рд░рд╛рдЙрдЯрд░ рдкрд░ рд╣рдо
insblod usblcd.ko рдХрд░рддреЗ рд╣реИрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдпрд╛ рджреЛ рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдЗрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ рдФрд░
rmmod usblcd рдХрд░реЗрдВ ред рддрдм рд╣рдо
dmesg рдХрд╣рддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
[ 6002.060000] usbcore: registered new interface driver usblcd [ 6010.850000] usb 1-1: new full-speed USB device number 2 using ehci-platform [ 6011.010000] USB STM32-based LCD module connected [ 6015.140000] usb 1-1: USB disconnect, device number 2 [ 6015.140000] USB STM32-based LCD module disconnected [ 6024.240000] usbcore: deregistering interface driver usblcd
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ \ n рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдлреНрд▓рд╢ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рджреЗрд░реА рдХрд┐рдП, рдПрдХ рдирдП рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдбрд┐рдмрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВред
рдпрд╣ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдЕрднреА рддрдХ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлреНрд░реЗрдордмрдлрд╝рд░ рдбреНрд░рд╛рдЗрд╡рд░ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдпреВрдПрд╕рдмреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рддрдерд╛рдХрдерд┐рдд рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд░реНрдЧ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо, рдХрд┐рд╕реА рдХреИрд░реЗрдХреНрдЯрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рддрд░рд╣, рд╕рд╛рдзрд╛рд░рдг рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП file_operations рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдЙрджреНрдШрд╛рдЯрди, рд╕рдорд╛рдкрди, рдкрдврд╝рдирд╛, рд▓рд┐рдЦрдирд╛, рдЖрджрд┐ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреЙрд░реНрдб рдХреЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рдХреНрдпрд╛ рдЦрддрд░реЗ рд╣реИрдВ - рдПрдХ рдкреНрд░рджрд░реНрд╢рди, рдПрдХ рдзреНрд╡рдирд┐ рдмреЙрдХреНрд╕ рдпрд╛ рдПрдХ рдорд╛рдЙрд╕ред рдЗрд╕ рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП, Xs рд╢реБрд░реВ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - Xs рдХреЛ рдПрдХ рдлреНрд░реЗрдордмрдлрд╝рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
static struct usb_class_driver usblcd_class = { .name = "lcd%d", .fops = &LCD_fops, .minor_base = LCD_MINOR_BASE, };
рдпрд╣рд╛рдВ, рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдирд╛рдо рдХреЗ рдмрд╛рдж рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП% d рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рджреВрд╕рд░рд╛ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рд╡рд╣ рдирдВрдмрд░ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╛рдмрд╛рд▓рд┐рдЧреЛрдВ рдХреЗ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рдЖрджреЗрд╢ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рд╣рдо рдХреЙрд▓рдмреИрдХ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди 0 рдХреЗ рд╕рд╛рде)
рдХреЙрд▓рдмреИрдХ static int LCDOpen(struct inode *inode, struct file *filp); static int LCDrelease(struct inode *inode, struct file *file); static ssize_t LCDwrite(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos);
- File_operations рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
File_operations рд╕рдВрд░рдЪрдирд╛ static struct file_operations LCD_fops = { .owner = THIS_MODULE, .write = LCDwrite, .open = LCDOpen, .release = LCDrelease, };
рдПрдХ .read рдХреЙрд▓рдмреИрдХ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЗрд╡рд▓-рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ (рдЗрд╕реА рддрд░рд╣, рдЖрдк рд▓реЗрдЦрди рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдУрдкрди рдпрд╛ рд░рд┐рд▓реАрдЬрд╝ рдХреА рдХрдореА рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓ рдпрд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдпреЗ рдСрдкрд░реЗрд╢рди рд╣рдореЗрд╢рд╛ рд╕рдлрд▓ рд╣реИрдВ)ред
- рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдЗрди рд╕рднреА рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдХрд╕реНрдЯрдо рд╕рдВрд░рдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдлрд╝реАрд▓реНрдб usb_device рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрдЧрд╛, рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЬрд╛рдВрдЪ рдХреЙрд▓рдмреИрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдмрд▓реНрдХрд┐, рдпрд╛ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд), рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдкрдХреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
Usblcd рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ struct usblcd { struct usb_device *udev; struct usb_interface *interface; unsigned char minor; struct usb_endpoint_descriptor *bulk_out_ep; unsigned int bulk_out_packet_size; unsigned char *videobuffer; };
- рд╣рдо рдХреЙрд▓рдмреИрдХ рдЬрд╛рдВрдЪ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдмрдлрд╝рд░реНрд╕ рдХреА рд╕рднреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрдлрд╝рд░ рд╣реИрдВ рдЬреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЦреБрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ LCD_fops.open рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЬрд╛рдВрдЪ рдХреЙрд▓рдмреИрдХ рдХреЛрдб static int LCDProbe(struct usb_interface *interface, const struct usb_device_id *id) { struct usblcd *dev; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; int retval = -ENODEV; int i; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) { dev_err(&interface->dev, "Out of memory\n"); retval = -ENOMEM; goto exit; } dev->udev=interface_to_usbdev(interface); mutex_init(&dev->io_mutex); dev->interface = interface; iface_desc = interface->cur_altsetting; for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { endpoint = &iface_desc->endpoint[i].desc; if(usb_endpoint_is_bulk_out(endpoint)) { dev->bulk_out_ep=endpoint; dev->bulk_out_packet_size = le16_to_cpu(endpoint->wMaxPacketSize); break; } } if(!dev->bulk_out_ep) { dev_err(&interface->dev, "Can not find bulk-out endpoint!\n"); retval = -EIO; goto error_dev; } dev->videobuffer=kmalloc(TOTAL_BUFFER_SIZE, GFP_KERNEL); if (!dev->videobuffer) { dev_err(&interface->dev, "Out of memory\n"); retval = -ENOMEM; goto error_dev; } usb_set_intfdata(interface, dev); retval = usb_register_dev(interface, &usblcd_class); if (retval) { dev_err(&interface->dev, "Not able to get a minor for this device."); usb_set_intfdata(interface, NULL); goto error_buff; } dev->minor = interface->minor; dev_info(&interface->dev, "USB STM32-based LCD module connected as lcd%d\n",dev->minor-LCD_MINOR_BASE); return 0; error_buff: kfree(dev->videobuffer); error_dev: kfree(dev); exit: return retval; }
Usb_device * udv рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ * usb_interface рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрд▓рдмреИрдХ рджреНрд╡рд╛рд░рд╛ interface_to_usbdev (рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдПрдХ рдЙрдкрдХрд░рдг рдореЗрдВ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╣реА рд╕рдВрд░рдЪрдирд╛ ( рдЗрдВрдЯрд░рдлрд╝реЗрд╕-> cur_altsetting (); ) рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИрдВрдбрд▓ ( usb_host_interface ) рдорд┐рд▓рддрд╛ рд╣реИ ;
рдЕрдЧрд▓рд╛, рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдХреЛрдИ рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд░рдЦрддреЗ рд╣реБрдП рдФрд░ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рд╣реИред рдмрд▓реНрдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рднреЗрдЬрдиреЗ рдХреЗ рджреМрд░рд╛рди рдмрдлрд╝рд░ рдЖрдХрд╛рд░ рдХреЛ рдЗрд╕ рдорд╛рди рд╕реЗ рдмрдбрд╝рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрд░реНрдиреЗрд▓ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЙрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдкреИрдХреЗрдЯ рдореЗрдВ рддреЛрдбрд╝ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрдкрдиреА рдорди рдХреА рд╢рд╛рдВрддрд┐ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛рдпрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ рдЙрди 0x40 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдереЗред рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд┐рдВрджреБ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ рдлреЙрд░реНрдо usb_endpoint_is_bulk_out (рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ) рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ le16_to_cpu (рдереЛрдбрд╝рд╛ рдПрдВрдбрд┐рдпрди 16-рдмрд┐рдЯ рд╕реАрдкреАрдпреВ рдСрд░реНрдбрд░) рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдЬрдм рд╕рдм рдХреБрдЫ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХрд░реНрдиреЗрд▓ рдХреА рдмрд╣реБрдд рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ usb_set_intfdata (рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рджреЗрд╡) рдХреЗ рд▓рд┐рдП; Probe рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг USB рдХреНрд▓рд╛рд╕ рдЪрд╛рд▓рдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ, рдлрд╝рд╛рдЗрд▓ / dev / lcd [n] / dev рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдФрд░ LCD_fops рд╕реЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп (рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╕рдордп) рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛-> рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реМрдВрдкреЗ рдЧрдП рдорд╛рдореВрд▓реА рдирд╛рдмрд╛рд▓рд┐рдЧ ред рдЗрд╕рд╕реЗ LCD_MINOR_BASE рдШрдЯрд╛рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╡рд╣ рдирдВрдмрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдбрд┐рд╡рд╛рдЗрд╕ / dev / рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ, рддреЛ рдирд╛рдмрд╛рд▓рд┐рдЧ рдХреНрд░рдорд╢рдГ LCD_MINOR_BASE рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, / dev / lcd0 / dev рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред - рддреБрд░рдВрдд рд╕рдордорд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХреЙрд▓рдмреИрдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВ, рдХреЙрд▓ рджреЗрд╡ = usb_get_intfdata (рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ usblcd рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдПрдХ рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ ;
рдХреЙрд▓рдмреИрдХ рдХреЛрдб рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ static void LCDDisconnect(struct usb_interface *interface) { struct usblcd *dev; int minor; dev = usb_get_intfdata(interface); minor=dev->minor; usb_set_intfdata(interface, NULL); usb_deregister_dev(interface, &usblcd_class); dev->interface = NULL; kfree(dev->videobuffer); kfree(dev); dev_info(&interface->dev,"USB STM32-based LCD module lcd%d disconnected\n",minor-LCD_MINOR_BASE); }
рд╣рдо NULL рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд░реНрдЧ рдХреЛ рдбреАрд░реЗрдЧрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдХреНрд╖рдг рд╕реЗ, рдХреЛрдИ рднреА рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рдирд╣реАрдВ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдЖрд╡рдВрдЯрд┐рдд рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рджреЗрд╡ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╣реА рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВред , LCD_fops, , , . , , . ┬л , Disconnect Open? Write?┬╗
, , write. - , .
, .
, , . , , , , : static atomic_t DeviceFree=ATOMIC_INIT(1);
Open , Linux Device Drivers:
if(!atomic_dec_and_test(&DeviceFree)) { atomic_inc(&DeviceFree); return -EBUSY; } return 0;
atomic_dec_and_test , , (DeviceFree = 1), (DeviceFree = 0), true, .. true .
(DeviceFree = 0), DeviceFree = -1 false. (.. ) тАФ (EBUSY, ). , , , тАФ , .. DeviceFree -2 false. - рддреБрд░рдВрдд рдХреЙрд▓рдмреИрдХ рд░рд┐рд▓реАрдЬрд╝
рдПрдЯреЙрдорд┐рдХ_рдХреА (& рдбрд┐рд╡рд╛рдЗрд╕рдлрд╝реНрд░реА) рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ;
рдбрд┐рд╡рд╛рдЗрд╕ рдореБрдХреНрдд рд╣реИ рдХрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧред
рдЕрдм рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдХреЗ рдФрд░ рд░рд╛рдЙрдЯрд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдХреЛрдб рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИредInsmod usblcd.ko рдЪрд▓рд╛рдиреЗ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, dmesg рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: [ 9323.880000] usbcore: registered new interface driver usblcd [ 9334.640000] usb 1-1: new full-speed USB device number 4 using ehci-platform [ 9334.800000] usblcd 1-1:1.0: USB STM32-based LCD module connected as lcd0
рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / lcd0 рдХреЛ / dev / рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ root@OpenWrt:~
рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдХреЛрдИ рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ (рд╣рдо рдПрдХ рд╣реА рдХрдорд╛рдВрдб рдХреЛ рджреЛ ssh рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ): root@OpenWrt:~
рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред- рд╣рдо рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ <linux / mutex.h>
рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ io_mutex рдЬреЛрдбрд╝реЗрдВ ;
рдЬрд╛рдВрдЪ рдХреЙрд▓рдмреИрдХ рдореЗрдВ - mutex_init (& dev-> io_mutex) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг ; - Disconnect, -:
Disconnect static void LCDDisconnect(struct usb_interface *interface) { struct usblcd *dev; int minor; dev = usb_get_intfdata(interface); minor=dev->minor; usb_set_intfdata(interface, NULL); usb_deregister_dev(interface, &usblcd_class); mutex_lock(&dev->io_mutex); dev->interface = NULL; mutex_unlock(&dev->io_mutex); kfree(dev->videobuffer); kfree(dev); dev_info(&interface->dev,"USB STM32-based LCD module lcd%d disconnected\n",minor-LCD_MINOR_BASE); }
, , - dev->interface . , io_mutex, , ( dev->interface ), ( NULL).
- Open:
, ,
subminor = iminor(inode);
usb_interface interface = usb_find_interface(&usblcd_driver, subminor);
dev = usb_get_intfdata(interface); . , mutex_lock(&dev->io_mutex); , , .
, , LCD_fops:
filp->private_data = dev;
Open static int LCDOpen(struct inode *inode, struct file *filp) { struct usblcd *dev; struct usb_interface *interface; int retval = 0; int subminor; filp->private_data=NULL; if(!atomic_dec_and_test(&DeviceFree)) { atomic_inc(&DeviceFree); retval = -EBUSY; goto exit; } subminor = iminor(inode); interface = usb_find_interface(&usblcd_driver, subminor); if (!interface) { printk(KERN_ERR "usblcd driver error, can't find device for minor %d\n", subminor); retval = -ENODEV; goto exit; } dev = usb_get_intfdata(interface); if (!dev) { retval = -ENODEV; goto exit; } mutex_lock(&dev->io_mutex); if(!dev->interface) { retval = -ENODEV; goto unlock_exit; } filp->private_data = dev; dev_info(&interface->dev, "usblcd: opened successfuly"); unlock_exit: mutex_unlock(&dev->io_mutex); exit: return retval; }
- , , ( ) X (unsigned short), Y (unsigned short), (unsgned long). Little Endian.
Write static ssize_t LCDwrite(struct file *filp, const char __user *user_buf, size_t count, loff_t *ppos) { struct usblcd *dev; struct usb_interface *interface; int retval = -ENODEV; int usbSent; int writtenCount=count; int x,y; if(*ppos>=VB_SIZE*2) { retval = -ENOSPC; goto exit; } if(*ppos+count>VB_SIZE*2) writtenCount=VB_SIZE*2-*ppos; dev = filp->private_data; if (!dev) { printk(KERN_ERR "usblcd driver error, no device found\n"); retval = -ENODEV; goto exit; } mutex_lock(&dev->io_mutex); interface = dev->interface; if (!interface) { printk(KERN_ERR "usblcd driver error, no device found\n"); retval = -ENODEV; goto exit; } if (copy_from_user(dev->videobuffer+8, user_buf, writtenCount)) { retval = -EFAULT; goto unlock_exit; } y=((int)((*ppos)>>1)/(int)WIDTH); x=((int)((*ppos)>>1))-y*WIDTH; *(unsigned short*)(dev->videobuffer)=cpu_to_le16(x); *(unsigned short*)(dev->videobuffer+2)=cpu_to_le16(y); *(unsigned long*)(dev->videobuffer+4)=cpu_to_le32(writtenCount>>1); retval = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 1),dev->videobuffer, 8+writtenCount, &usbSent, HZ*5); if (!retval) { retval = writtenCount; *ppos+=writtenCount; } else { retval=-EIO; goto unlock_exit; } unlock_exit: mutex_unlock(&dev->io_mutex); exit: return retval; }
, тАФ 320*240*2 . тАФ . *ppos, . , , , dev->interface тАФ NULL . , , ( Endian ) usb_bulk_msg .
, , , , .
, , , , .. . .
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдЪрд╛ рд╣реИ: рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрд▓реНрдбрд╡рд░реНрд▓реНрдб рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ), рдЗрд╕реЗ рд░рд╛рдЙрдЯрд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ insmod usblcd.ko рдЪрд▓рд╛рдПрдВ редрд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреНрд░реИрд╢ рди рд╣реЛ, рдбрд┐рд╡рд╛рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ / dev / lcd0 рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ редрдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ!рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: cat /dev/urandom > /dev/lcd0
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдореБрдЦреНрдп рдмрд╛рдЗрдирд░реА рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ - рдмрд┐рдЬреАрдмреЙрдХреНрд╕: cat /bin/busybox > /dev/lcd0
рдХреНрдпрд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдФрд░ рд╢реБрджреНрдз рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ?рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдХреБрдЫ рдЪрд┐рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ: cat hobgoblin.raw > /dev/lcd0

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