рд╣рдо рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Xbox 360 рд╕реЗ PSP рдЧреЗрдордкреИрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ

... рдпрд╛ рдПрдХ рдХрд╣рд╛рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдкреЗрдВрдЧреБрдЗрди рдиреЗ рдЕрдореЗрд░рд┐рдХрд╛ рдФрд░ рдЬрд╛рдкрд╛рди рдХреЗ рд╕рд╛рде рджреЛрд╕реНрддреА рдХреАред



рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд╛рдЪреАрди рд╕рдордп рдореЗрдВ, рд▓реЛрдЧ рд╕реЛрдиреА рдкреНрд▓реЗрд╕реНрдЯреЗрд╢рди рдкрд░ рдЦреЗрд▓рддреЗ рдереЗ рдФрд░ рд╡реЗ рд╣рд░ рдЪреАрдЬ рд╕реЗ рдЦреБрд╢ рдереЗред рд▓реЗрдХрд┐рди рдкреНрд░рдЧрддрд┐ рддрдм рднреА рдЯрд┐рдХ рдирд╣реАрдВ рдкрд╛рдИред Microcircuits рдХреЗ рдПрдХреАрдХрд░рдг рдХреА рдбрд┐рдЧреНрд░реА рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИред рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рдирдП рдлреЙрд░реНрдо рдХрд╛рд░рдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдФрд░ рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдирдП рдмрд╛рдЬрд╛рд░реЛрдВ рдХреА рддрд▓рд╛рд╢ рд╣реИред рдЗрд╕рд▓рд┐рдП 2005 рдореЗрдВ, рд╕реЛрдиреА Playstation рдкреЛрд░реНрдЯреЗрдмрд▓, рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдЧреЗрдорд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, рдЬрд╛рдкрд╛рди рдХреЗ рдмрд╛рд╣рд░ рдмрд┐рдХреНрд░реА рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ ред рдЙрд╕рдХреА рдЧреЗрдо рд▓рд╛рдЗрди (рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде) PSP рдЖрдпрд░рди рдЧреЗрдореНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдереАред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдореНрдпреВрд▓реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓ рдкреНрд▓реЗрд╕реНрдЯреЗрд╢рди рд╕реЗ рдЧреЗрдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рднреА рдереАред рдпрджреНрдпрдкрд┐, рд╢рд╛рдпрдж, рдореБрдЦреНрдп рднреВрдорд┐рдХрд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдирд┐рднрд╛рдИ рдЧрдИ рдереА рдХрд┐ PlayStation рдФрд░ PSP рджреЛрдиреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдерд╛ - рдЕрд░реНрдерд╛рддреН, MIPSред рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓реЙрдиреНрдЪ рдХреЗ рд╡рд░реНрд╖ рдореЗрдВ, рддреБрд░рдВрдд, PSP рдПрд╕рдбреАрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓реАрдХ рд╣реЛ рдЧрдПред рдирддреАрдЬрддрди, рд▓реЙрдиреНрдЪ рдХреЗ рд▓рдЧрднрдЧ 10 рд╕рд╛рд▓ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЦреЗрд▓реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдордмреНрд░реЗрд╡ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм, рд░реВрд╕ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╢рд╣рд░ рдореЗрдВ рдирд╣реАрдВ, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ PSP (рд╕рдмрд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдВрд╢реЛрдзрди) 3000 рд░реВрдмрд▓ рдХреЗ рд▓рд┐рдП рдЦрд░реАрджрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рдмрдЬрдЯ рдЧреЗрдорд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдмреЗрд╕ рд╣реИред рд╕рдмрд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдВрд╢реЛрдзрди рдореЗрдВ рдПрдХ рдЯреАрд╡реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рд▓реЗрдХрд┐рди рд▓рдВрдмреЗ рд╕рдордп рддрдХ PSP рдХреЛ рдЧреЗрдордкреИрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреАрд╡реА рдХрдиреЗрдХреНрдЯрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддреИрдирд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде, рдЪрд╛рд░реНрдЬрд░ рд╕реЗ - рдПрдХ рджреВрд╕рд░реЗ рддрд╛рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд┐рдореЗрд░рд╛ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддреЗ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ geeky рд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП - рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ PSP рдХреЗ рд▓рд┐рдП USB рдХреНрд▓рд╛рдЗрдВрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╡рд┐рд╖рдп рд╣реИрдВ, PSP рдореЗрдВ рд╣реБрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐, USB рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред рд╣рдо рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреЛрд░реНрдЯреЗрдмрд▓ рдХрдВрд╕реЛрд▓ рдХреЛ рдЯреАрд╡реА рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдирдпрд╛ рдирд╣реАрдВ рд╣реИ


рд▓реЗрдХрд┐рди рд╣рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рдЪреВрдВрдХрд┐ PSP рд▓рдЧрднрдЧ 10 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕реЛрдиреА рдХреА рдкреЛрд░реНрдЯреЗрдмрд▓ рдХрдВрд╕реЛрд▓ рдХреА рдЕрдЧрд▓реА рдкреАрдврд╝реА, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╕реЛрдиреА рдкреНрд▓реЗрд╕реНрдЯреЗрд╢рди рд╡реАрдЯрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рдкрд╛рди рдореЗрдВ рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдХрдВрд╕реЛрд▓ рдХрд╛ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред рд╕реЛрдиреА рдкреНрд▓реЗрд╕реНрдЯреЗрд╢рди рд╡реАрдЯрд╛ рдЯреАрд╡реАред
рдкреАрдПрд╕ рд╡реАрдЯрд╛ рдЯреА.рд╡реА.


рдЧреЗрдордкреИрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ Playstation 3 рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдбреНрдпреВрд▓рд╢реЙрдХ 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдпреВрдПрд╕рдмреА рдпрд╛ рдмреНрд▓реВрдЯреВрде рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╡реАрдЯрд╛ рдХреА рддрд░рд╣ рд╡реАрдЯрд╛ рдЯреАрд╡реА, рдореВрд▓ рдкреНрд▓реЗрд╕реНрдЯреЗрд╢рди рд╕реЗ рд╡реАрдЯрд╛, рдкреАрдПрд╕рдкреА рдФрд░ рдЧреЗрдо рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, "рд╕реНрдерд┐рд░ рдкреЛрд░реНрдЯреЗрдмрд▓" рдХрдВрд╕реЛрд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕реБрд╕рдВрдЧрдд рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рджреЛрд╕реНрддреЛрдВ рдХреЛ рдЧреЗрдордкреИрдб рдФрд░ рдкреАрдПрд╕рдкреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛?


рдЕрдЧрд▓рд╛, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд╣рд░реА рдЧреЗрдордкреИрдб рдХреЛ рдкреАрдПрд╕рдкреА рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреАрдПрд╕рдкреА рдореЗрдВ рдПрдХ рдпреВрдПрд╕рдмреА рдХрдиреЗрдХреНрдЯрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрд╕рд╛рд╣реА рд▓реЛрдЧреЛрдВ рдиреЗ рдкреАрдПрд╕рдкреА рдХреЛ рдХрдиреЗрдХреНрдЯреЗрдб рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЧреЗрдо рдЪрд▓рд╛рдирд╛ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ рдпрд╛ рдЧреЗрдо рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЛ рдЗрд╕реА рдпреВрдПрд╕рдмреА рдХрдиреЗрдХреНрдЯреЗрдб рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛ , рдкреАрдПрд╕рдкреА рдореЗрдВ рдпреВрдПрд╕рдмреА рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдорд╛рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрдорд░рд╛) рд╣реЛрд╕реНрдЯ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╡реИрд╕реЗ, рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ Google рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╛рдиреА рдПрдХ PSP рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдордкреИрдб рдХреЛ рд╕реАрдзреЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдмреЗрдХрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕реНрдЯреЛрд░ рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдХреЗ рдбрд┐рдмрдЧ рдмреЛрд░реНрдб рдХреА рд▓рд╛рдЧрдд 1 рд╕реЗ 10 рд╣рдЬрд╛рд░ рд░реВрдмрд▓ рддрдХ рд╣реЛрддреА рд╣реИред рдЬрдмрдХрд┐ рдпреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрд▓рдЧ рд╕реЗ USB рд╣реЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред
рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ


рдЗрд╕ рдорд╢реАрди рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реИрдВ - 2 рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ, рд╕рд╛рде рд╣реА рдкреВрд░реНрдг рд▓рд┐рдирдХреНрд╕ред рдирд╣реАрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд░реВрд╕реА рд╢рд╣рд░ рдореЗрдВ, рдПрдХ рдкреБрд░рд╛рдиреЗ рдореЙрдбрд▓ (512 рдПрдордмреА рдореЗрдореЛрд░реА рдФрд░ рдИрдерд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде) рдореЗрдВ рдирд┐: рд╢реБрд▓реНрдХ рдирд┐рдЬреА рдмреБрд▓реЗрдЯрдкреНрд░реВрдл рдмреЛрд░реНрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 1,500 рд░реВрдмрд▓ рдХреА рд▓рд╛рдЧрдд рд╣реИред рд╕рдмрд╕реЗ рд╕рд╕реНрддреА рдирд┐рдпрдВрддреНрд░рдХ рдбрд┐рдмрдЧ рдмреЛрд░реНрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреАрдордд рдХрдо рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред рдФрд░ "рдореЗрдб рдЗрди рдж рдпреВрдХреЗ" рднреАред

рдкрдврд╝рд╛рдИ рд╢реБрд░реВ


рдпрджрд┐ рдЖрдк рдмрд╕ USB рдХреЗрдмрд▓ рдХреЛ PSP рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ USB рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд╣рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЬреНрдЮрд╛рдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛рдиреА PSP рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдб рдШреВрдордирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ PSP рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рджрдмрд╛рд╡ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдЧрд╛ред рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рдЦреЗрд▓реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдмрд╣реБрдд рдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рдкрд╛рдпрд░реЗрдЯреЗрдб рдлрд░реНрдорд╡реЗрдпрд░ рдкрд░ рд╕рдВрднрд╡ рд╣реИред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдкрд╛рдпрд░реЗрдЯреЗрдб рдлрд░реНрдорд╡реЗрдпрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдкрд░ рд╕реНрдерд┐рдд рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдкрд░ рд░реИрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛрдб рдХреЛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ PSP рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛рд░реНрдб рд╕реЗ .iso рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЧреЗрдо рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдЧрд▓реЗ PSP рд░рд┐рдмреВрдЯ рддрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ рдпрд╣ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкреНрд▓рдЧрдЗрдиреНрд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЬреБрдбрд╝реА рд╣реБрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЬреЛ рдореБрдЦреНрдп рдореЗрдиреВ, рдкреАрдПрд╕рдкреА рдЧреЗрдо рдпрд╛ рдореВрд▓ Playstation рдХреЗ рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рдореВрд▓ PSP рдлрд░реНрдорд╡реЗрдпрд░ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 6.60 рд╣реИред рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рддреЗрдЬ рдХрд┐рдП рдЧрдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдирд╡реАрдирддрдо рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рддрд╣рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рд╣реА рд╣реБрдЖред рдПрдХ рдкреНрд▓рдЧрдЗрди рдЬреЛ рдПрдХ PSP рд╕реЗ рдПрдХ рд╡рд┐рдВрдбреЛрдЬ-рдЖрдзрд╛рд░рд┐рдд рдкреАрд╕реА рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдПрдХ PSP рд╕реЗ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ PSP рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ PSP рдореЗрдВ рдПрдХ рдкреАрд╕реА рд╕реЗ рдЬреБрдбрд╝реЗ рдЧреЗрдордкреИрдб рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдпреВрдПрд╕рдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрд╡рд▓ рдЖрдзрд╛ рдлрд░реНрдорд╡реЗрдпрд░ 6.60 рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЧреЗрдордкреИрдб рд╕реЗ рдкреАрдПрд╕рдкреА рддрдХ рдбреЗрдЯрд╛ рдкрд╣реБрдВрдЪ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдкреАрдПрд╕рдкреА рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдРрд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХреА рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рдлрд░реНрдорд╡реЗрдпрд░ 6.60 рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рдФрд░ рдорд┐рд▓ рдЧрдпрд╛ред PSP рдПрдирд╛рд▓реЙрдЧ рд╕реНрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╡реАрдирддрдо рдлрд░реНрдорд╡реЗрдпрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рднреА PSP рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЗрд╕ рд╣реЛрдордмреНрд░реЗ рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

PSP рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╕рдВрд╢реЛрдзрдиред Hookyред


рдкреНрд▓рдЧ-рдЗрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛, рдореИрдВрдиреЗ рд╡рд╣ рдЪреБрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА USB рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдХрд╛рд░реНрдп рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдкреНрд░рд┐рдВрдЯрдл () рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдкреАрдПрд╕рдкреА рдкрд░ред рдпрд╣ рдЪрдпрдирд┐рдд рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдкреНрд▓рдЧрдЗрди рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореИрдВ PSP рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдпрд╣ рдлреНрд░реЗрдо рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЛ рдбреНрд░рд╛рдЗрдВрдЧ рдХрд░рдиреЗ рдФрд░ рдореБрдЭреЗ рдбрд┐рдмрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рдХрд┐ рдлреНрд░реЗрдо рдореЗрдВ рдореБрдЭреЗ рдЬрд░реВрд░рдд рдереАред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдХреИрдкреНрдЪрд░ рдлрдВрдХреНрд╢рди (рд╣реБрдХ) рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

#define GET_JUMP_TARGET_(x) (0x80000000 | (((x) & 0x03FFFFFF) << 2)) int (*g_setframebuf)(int unk, void* addr, int width, int psm, int sync); int setframebuf_hook_func(int unk, void* addr, int width, int psm, int sync) { if(g_info == 1) { dbgprint( debugmsg, addr, psm ); if (!g_info) DEBUG_RESET() } return g_setframebuf(unk, addr, width, psm, sync); } int hook_function(unsigned int* jump, void* hook, unsigned int* result) { unsigned int target; unsigned int func; int inst; target = GET_JUMP_TARGET_(*jump); while (((inst = _lw(target+4)) & ~0x03FFFFFF) != 0x0C000000) // search next JAL instruction target += 4; if((inst & ~0x03FFFFFF) != 0x0C000000) { printf("invalid!\n"); return 1; } *result = GET_JUMP_TARGET_(inst); func = (unsigned int) hook; func = (func & 0x0FFFFFFF) >> 2; _sw(0x0C000000 | func, target+4); return 0; } int module_start( SceSize args, void *argp ) { //... hook_function( (unsigned int*) sceDisplaySetFrameBuf, setframebuf_hook_func, (unsigned int*)&g_setframebuf ); //... } 

рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, PSP рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, PSP рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, sceDisplaySetFrameBuf () рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ setframebuf_hook_func () рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдФрд░ рдореВрд▓ sceDisplaySetFrameBuf () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рдЖрдкрдХреЛ g_setframebuf () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣реБрдХ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

PSP рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╕рдВрд╢реЛрдзрдиред рдкреНрд░рдмрдВрдзрдиред


рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдп sceCtrlReadBufferPositive (), sceCtrlPeekBufferPositive (), sceCtrlReadBufferNegative () рдФрд░ sceCtrlPeekBufferNegative () рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд▓реЗрддреЗ рд╣реБрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реБрдХ рдореЗрдВ рдХрд╛рдо рдХреЗ рд╣реБрдХ рдЬреЛрдбрд╝реЗред рдореИрдВрдиреЗ рдЕрднреА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреАрд╕реА рдХреЗ рд╣реЛрд╕реНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдЧреЗрдордкреИрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ PSP рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЧрдпрд╛ рдЖрдЦрд┐рд░реА рдбреЗрдЯрд╛ рдЙрдирдХреЗ рдЕрдВрджрд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдерд╛ред рдпрд╣рд╛рдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ ред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреАрд╕реА рднрд╛рдЧ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпреВрдПрд╕рдмреА рдЪрд╛рд▓рдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ PSP рдкрд░ рдкреНрд▓рдЧрдЗрди рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдЖрдк рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Yandex рдореЗрдВ googling рджреНрд╡рд╛рд░рд╛ рдкреНрд▓рдЧрдЗрди рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ)ред рдлрд┐рд░ PSP рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреАрд╕реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдПрдХ PSP рдкреНрд░рдХрд╛рд░ рдмреА рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдмрд╛рдж, рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдмрд┐рди \ inf- рд╡рд┐рдЬрд╝рд╛рд░реНрдбред Exe), рд╣рдорд╛рд░реЗ PSP рдкреНрд░рдХрд╛рд░ рдмреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рдЖрдкрдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рд╣реИред

рдиреНрдпреВрдирддрдо PSP рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рдХрд░рдирд╛


рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХреЗрд╡рд▓ 0.19 рд░рд┐рдореЛрдЯрдЬреЙрдпрд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИрдВред рдФрд░ рдпрд╣ рдХреБрдЫ рдЧреЗрдо рдкрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗ-рдСрди! рдмреЗрддрд╣рд╛рд╢рд╛ рдзреАрдорд╛ рд╣реИ, рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рдЖрд░реНрдЯрд┐рдлрд╝рд┐рдХ рдбрдВрдЧрдСрди рд╕реАрдЬрд╝рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ)ред рд╕рдВрд╕реНрдХрд░рдг реж.реиреж рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЧреЗрдордкреИрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдкреАрдПрд╕рдкреА рднрд╛рдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдПрд╕рдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред PSP рд╕реЗ PC рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ PC рд╕реЗ PSP рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмреНрд░реЗрдХ рдФрд░ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рдЧреБрдордирд╛рдореА рдореЗрдВ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИрдВ:

 #define USBDATA_PATTERN 0x1234ABFE struct { unsigned int Pattern; unsigned int ButtonData; unsigned int AnalogX; unsigned int AnalogY; } PSPUsbData; 

рд╕реНрд╡рдпрдВ рдкреАрдПрд╕рдкреА рдореЗрдВ рдЫрдбрд╝реА рд╕реЗ рдПрдирд╛рд▓реЙрдЧ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖ (127 рдХреЗрдВрджреНрд░) рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдмрд╛рдЗрдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкреИрдХрд┐рдВрдЧ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ RemoteJoyLite рдореЗрдВ рд╣реА, рдбреЗрдЯрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 struct HostFsCmd { uint32_t magic; uint32_t command; uint32_t extralen; } __attribute__((packed)); 

рдФрд░ рдЗрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рд░рд┐рдореЛрдЯрдЬреЙрдпрд▓рд╛рдЗрдЯ рдЦреБрдж MinGW GCC рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ рдХрджрдо Microsoft Visual Studio рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ __attribute __ ((рдкреИрдХ)) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛), рдореИрдВрдиреЗ рд╕рднреА рд╕рдВрд░реЗрдЦрдг рдФрд░ рдкреИрдХреЗрдЬрд┐рдВрдЧ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ) рдЙрдиреНрд╣реЗрдВ 32-рдмрд┐рдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд▓рд╛рдирд╛ред рдирддреАрдЬрддрди, рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдЫреАрди-рдиреАрдЪреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рд╣реИрдВ - рджреЛрдиреЛрдВ PSP- рдФрд░ рд╡рд┐рдВрдбреЛрдЬ-рдкрд╛рд░реНрдЯред Windows рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ Microsoft Visual Studio 2010 рдХреЗ рд▓рд┐рдП C ++ рдореЗрдВ mfc рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред Windows рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреЗрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рдХрд░реНрд╕рд░ рдирд┐рдпрдВрддреНрд░рдг рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (mfc рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╡рд┐рдВрдбреЛ рд╕рдВрджреЗрд╢ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рд╣реЛ, рдФрд░ рд╕рдВрд╡рд╛рдж рдХреАрд╕реНрдЯреНрд░реЛрдХ рдореЗрдВ рдирд╣реАрдВ), рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рднреА рдкреНрд░рд┐рдВрдЯрдлрд╝ () рдлреЙрд░реНрдо рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгред рдкреАрдПрд╕рдкреА рднрд╛рдЧ рдореЗрдВ, рд╕рдВрд▓рдЧреНрди рд╣рд▓реНрдХреЗ рд╕реНрд░реЛрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдпреВрдПрд╕рдмреА, рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдкреНрд░рд┐рдВрдЯрдл () рд╢реЗрд╖ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, USB рдбреЗрдЯрд╛ рд░рд┐рд╕реЗрдкреНрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ рдФрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред USB рд╣реЛрд╕реНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, USB рдмрд╕ рдкрд░ рдЖрдВрддрд░рд┐рдХ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (USB рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВ) рдХреЗ рдмрд╛рдж, рдПрдХ UsbAttach () рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЙрд▓ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдкрдВрдЬреАрдХреГрдд рдбреНрд░рд╛рдЗрд╡рд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдерд╛:

 #define RJLITE_DRIVERNAME "RJLiteDriver" #define RJLITE_DRIVERPID (0x1C9) struct UsbDriver UsbDriver = { RJLITE_DRIVERNAME, 4, UsbEndpoint, &UsbInterface, &UsbData[0].devdesc[0], &UsbData[0].config, &UsbData[1].devdesc[0], &UsbData[1].config, &StringDescriptor, UsbRequest, UsbUnknown, UsbAttach, UsbDetach, 0, UsbStartFunc, UsbStopFunc, NULL }; int module_start( SceSize args, void *argp ) { //... sceUsbbdRegister(&UsbDriver); if((sceUsbStart(PSP_USBBUS_DRIVERNAME, 0, 0) == 0) && (sceUsbStart(RJLITE_DRIVERNAME, 0, 0) == 0) && //... { //... } //... } 

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

 static SceUID UsbMainEventFlag = -1; static int UsbStartFunc( int size, void *p ) { //... UsbMainEventFlag = sceKernelCreateEventFlag( "USBMainEvent", 0x200, 0, NULL ); //... UsbMainThreadID = sceKernelCreateThread( "USBMainThread", UsbMainThread, 10, 0x10000, 0, NULL ); //... sceKernelStartThread( UsbMainThreadID, 0, NULL ); //... } 

рддреЛ, рдФрд░ UsbAttach рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ () UsbMainEventFlag рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдзреНрд╡рдЬ рдЪрд░ рдореЗрдВ рдлреНрд▓реИрдЧ USB_EVENT_ATTACH рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 static int UsbAttach(int speed, void *arg2, void *arg3) { sceKernelSetEventFlag( UsbMainEventFlag, USB_EVENT_ATTACH); return 0; } 

рдЙрд╕реА рд╕рдордп, UsbMainThread () рдереНрд░реЗрдб рдореЗрдВ рдкреВрд░реНрд╡ рдореЗрдВ UsbStartFunc () рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ:

 static int UsbMainThread(SceSize size, void *argp) { int ret; u32 result; while(1) { ret = sceKernelWaitEventFlag(UsbMainEventFlag, USB_EVENT_ATTACH | USB_EVENT_ASYNC, PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL); if(ret < 0) { sceKernelExitDeleteThread(0); } if(result&USB_EVENT_ASYNC) { usb_async_events++;//nyashkoshkko: debug SetUsbAyncReq(&PSPUsbData, sizeof(PSPUsbData)); } if(result&USB_EVENT_ATTACH) { usb_attach_events++;//nyashkoshkko: debug SetUsbAyncReq(&PSPUsbData, sizeof(PSPUsbData)); } } return 0; } 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдереНрд░реЗрдб USB_EVENT_ATTACH рдзреНрд╡рдЬ рдпрд╛ USB_EVENT_ASYNC рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ UsbMainEventFlag рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдзреНрд╡рдЬ рдЪрд░ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред USB рд╣реЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдлрд▓ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдХрд╛рд░рдг USB_EVENT_ATTACH рдзреНрд╡рдЬ рдХреА рд╕реНрдерд╛рдкрдирд╛ рд╣реБрдИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдзрд╛рдЧрд╛ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ USB_EVENT_ASTNC рдзреНрд╡рдЬ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 static int SetUsbAyncReq( void *data, int size ) { //... UsbAsyncReq.data = data; UsbAsyncReq.size = size; UsbAsyncReq.func = UsbAsyncReqDone; sceKernelClearEventFlag( UsbMainEventFlag, ~USB_EVENT_ASYNC ); return( sceUsbbdReqRecv( &UsbAsyncReq ) ); } 

рдЗрд╕ рдЕрдиреБрд░реЛрдз рдореЗрдВ, рдХреЙрд▓рдмреИрдХ UsbAsyncReqDone () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 static int UsbAsyncReqDone( struct UsbdDeviceReq *req, int arg2, int arg3 ) { sceKernelSetEventFlag( UsbMainEventFlag, USB_EVENT_ASYNC ); return( 0 ); } 

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

рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЗ рддрд╣рдд рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдпреВрдПрд╕рдмреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдирд╛


рддреЛ, PSP рднрд╛рдЧ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдпрд╛ рдмрд▓реНрдХрд┐ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЛ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрдХреВрд▓рд┐рдд рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдлреЗрдбреЛрд░рд╛ рдкрд░ рдмрд╕ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд░реЗрдб рд╣реИрдЯ рд╕реЗ рдЕрдкрдиреА рдЬрдбрд╝реЗрдВ рдЦреАрдВрдЪреАрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рдо рдерд╛ рдФрд░ рдЙрдирдХреЗ рдкреИрдХреЗрдЬ рд╡рд┐рддрд░рдг рдЖрд░рдкреАрдПрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдлреЗрдбреЛрд░рд╛ рд░реАрдорд┐рдХреНрд╕ 18 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрддрд╛ рдФрд░ рдЧреЗрдЯрд╡реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣реЛрдо рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдбреАрдПрдЪрд╕реАрдкреА рд╕рд░реНрд╡рд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рдЬреЛ рдХрд┐ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдорд╛рдЙрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рдЖрдЗрдХрди, SSH рд╕рд░реНрд╡рд░ рдмреЙрдХреНрд╕ рд╕реЗ рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди SMB рд╕рд░реНрд╡рд░ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ (smbpasswd рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ), рдЗрд╕рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛ рдЖрдзреА рд░рд╛рдд рдХреЗ рдХрдорд╛рдВрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SSH рджреНрд╡рд╛рд░рд╛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рд╢реБрд░реВ рдХреА рдереА рд╡рд╣ рдкреАрдПрд╕рдкреА рд╕реЗ рдЬреБрдбрд╝ рд░рд╣реА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдпреВрдПрд╕рдмреА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдПрдХ рдЫреЛрдЯреА рд╕реА рдЕрдкреНрд░рд┐рдп рдХрд╣рд╛рдиреА рдереА, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг, рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд▓рд┐рдирдХреНрд╕ рдХрд╛ рдкреВрд░рд╛ рдЖрдХрд░реНрд╖рдг рдореЗрд░реА рдЖрдБрдЦреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рдЧрд┐рд░ рд░рд╣рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рд╣реЗрдбрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ

 > yum install libusb1-devel 

рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рдЭрдЧрдбрд╝рд╛ рд╣реБрдЖ рдФрд░ рдЙрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓рд┐рдмрд╛рд╕рдмрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдареАрдХ рд╣реИ рдЯреАрдо

 > yum install libusbx-devel 

рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдкрд░ рд▓рд┐рдмрд╕рдмрдХреНрд╕ рд▓рд┐рдмрд╛рд╕ 1 рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИ, рдЬреЛ рдХрд┐ рд▓рд┐рдмрд╛рд╕рдм рдХреЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдореВрд▓ рд░рд┐рдореЛрдЯрдЬреЙрдпрд▓рд╛рдЗрдЯ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдареАрдХ рд╣реИред USB рдХреЗ рд╕рд╛рде, рдЕрдм рд▓рд┐рдирдХреНрд╕ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдЧреЗрдордкреИрдб рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдПрдХ рд╡рд╛рдпрд░реНрдб Xbox 360 рдЧреЗрдордкреИрдб рд╣реИ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдФрд░, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдкрд░ рдлреЗрдбреЛрд░рд╛ рд░реАрдорд┐рдХреНрд╕ 18 рдкрд░ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдкреИрд╕рд╛ рдмрдирд╛рдпрд╛, рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рдЗрдирдкреБрдЯ / js0 рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ ред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ xpad рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ Xboxdrv рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ - рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдФрд░ рдкреВрд░реНрдгрдХрд╛рд▓рд┐рдХ рд╣реИред
рд╡реИрд╕реЗ, android рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИред
Xpad рдбреНрд░рд╛рдЗрд╡рд░ Android рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:

 #define DRIVER_DESC "X-Box pad driver" 

рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рдЗрдирдкреБрдЯ / js0 рдЙрд╕реА рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 MODULE_SUPPORTED_DEVICE("input/js"); 

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

  /** * Gets the ids of all input devices in the system. * @return The input device ids. */ public static int[] getDeviceIds() { return InputManager.getInstance().getInputDeviceIds(); } 

getInputDeviceIds () :

  private final IInputManager mIm; //... private SparseArray<InputDevice> mInputDevices; //... /** * Gets the ids of all input devices in the system. * @return The input device ids. */ public int[] getInputDeviceIds() { synchronized (mInputDevicesLock) { populateInputDevicesLocked(); final int count = mInputDevices.size(); final int[] ids = new int[count]; for (int i = 0; i < count; i++) { ids[i] = mInputDevices.keyAt(i); } return ids; } } //... private void populateInputDevicesLocked() { if (mInputDevicesChangedListener == null) { final InputDevicesChangedListener listener = new InputDevicesChangedListener(); try { mIm.registerInputDevicesChangedListener(listener); } catch (RemoteException ex) { throw new RuntimeException( "Could not get register input device changed listener", ex); } mInputDevicesChangedListener = listener; } if (mInputDevices == null) { final int[] ids; try { ids = mIm.getInputDeviceIds(); } catch (RemoteException ex) { throw new RuntimeException("Could not get input device ids.", ex); } mInputDevices = new SparseArray<InputDevice>(); for (int i = 0; i < ids.length; i++) { mInputDevices.put(ids[i], null); } } } 

mIm.getInputDeviceIds () :

 interface IInputManager { // Gets input device information. InputDevice getInputDevice(int deviceId); int[] getInputDeviceIds(); //... 

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ InputManager рд╕реЗрд╡рд╛ рдЖрддреА рд╣реИ:

 import android.view.InputDevice; //... /* * Wraps the C++ InputManager and provides its callbacks. */ public class InputManagerService extends IInputManager.Stub implements Watchdog.Monitor, DisplayManagerService.InputManagerFuncs { static final String TAG = "InputManager"; static final boolean DEBUG = false; private static final String EXCLUDED_DEVICES_PATH = "etc/excluded-input-devices.xml"; //... private InputDevice[] mInputDevices = new InputDevice[0]; //... /** * Gets the ids of all input devices in the system. * @return The input device ids. */ @Override // Binder call public int[] getInputDeviceIds() { synchronized (mInputDevicesLock) { final int count = mInputDevices.length; int[] ids = new int[count]; for (int i = 0; i < count; i++) { ids[i] = mInputDevices[i].getId(); } return ids; } } 

getId () рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд╣рд╛рдБ рдереЗ (Android рдЕрджреНрднреБрдд рд╣реИ):

 public final class InputDevice implements Parcelable { private final int mId; //... /** * Gets the input device id. * <p> * Each input device receives a unique id when it is first configured * by the system. The input device id may change when the system is restarted or if the * input device is disconnected, reconnected or reconfigured at any time. * If you require a stable identifier for a device that persists across * boots and reconfigurations, use {@link #getDescriptor()}. * </p> * * @return The input device id. */ public int getId() { return mId; } //... // Called by native code. private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId, int productId, String descriptor, boolean isExternal, int sources, int keyboardType, KeyCharacterMap keyCharacterMap, boolean hasVibrator, boolean hasButtonUnderPad) { mId = id; mGeneration = generation; mControllerNumber = controllerNumber; mName = name; mVendorId = vendorId; mProductId = productId; mDescriptor = descriptor; mIsExternal = isExternal; mSources = sources; mKeyboardType = keyboardType; mKeyCharacterMap = keyCharacterMap; mHasVibrator = hasVibrator; mHasButtonUnderPad = hasButtonUnderPad; } private InputDevice(Parcel in) { mId = in.readInt(); mGeneration = in.readInt(); mControllerNumber = in.readInt(); mName = in.readString(); mVendorId = in.readInt(); mProductId = in.readInt(); mDescriptor = in.readString(); mIsExternal = in.readInt() != 0; mSources = in.readInt(); mKeyboardType = in.readInt(); mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in); mHasVibrator = in.readInt() != 0; mHasButtonUnderPad = in.readInt() != 0; for (;;) { int axis = in.readInt(); if (axis < 0) { break; } addMotionRange(axis, in.readInt(), in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat()); } } 

рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдореВрд▓ рднрд╛рдЧ рдореЗрдВ, InputDevice () рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ( рдЯреЛрд╕реНрдЯрд░ рд╕реЗ рд╢реАрдШреНрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж):

 jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& deviceInfo) { //... ScopedLocalRef<jobject> inputDeviceObj(env, env->NewObject(gInputDeviceClassInfo.clazz, gInputDeviceClassInfo.ctor, deviceInfo.getId(), deviceInfo.getGeneration(), deviceInfo.getControllerNumber(), nameObj.get(), static_cast<int32_t>(ident.vendor), static_cast<int32_t>(ident.product), descriptorObj.get(), deviceInfo.isExternal(), deviceInfo.getSources(), deviceInfo.getKeyboardType(), kcmObj.get(), deviceInfo.hasVibrator(), deviceInfo.hasButtonUnderPad())); 

рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдпрд╣рд╛рдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ :

 void NativeInputManager::notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) { JNIEnv* env = jniEnv(); //... jobject inputDeviceObj = android_view_InputDevice_create(env, inputDevices.itemAt(i)); 

InformInputDevicesChanged () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд InputManager рд╕реЗрд╡рд╛ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓рдмреИрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  // Native callback. private void notifyInputDevicesChanged(InputDevice[] inputDevices) { synchronized (mInputDevicesLock) { if (!mInputDevicesChangedPending) { mInputDevicesChangedPending = true; mHandler.obtainMessage(MSG_DELIVER_INPUT_DEVICES_CHANGED, mInputDevices).sendToTarget(); } mInputDevices = inputDevices; } } 

рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╕реНрд╡рдпрдВ рдЗрдирдкреБрдЯрд░реАрдбрд░ рдореЗрдВ рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИ :

 void InputReader::loopOnce() { //... size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE); //... // Send out a message that the describes the changed input devices. if (inputDevicesChanged) { mPolicy->notifyInputDevicesChanged(inputDevices); } 

рдпрд╣рд╛рдВ рд╣рдо рдпрд╣ рднреА рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдИрд╡реЗрдВрдЯреНрд╕ EventHubInterface рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

  sp<EventHubInterface> mEventHub; 

рдФрд░, рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рдХреНрд▓рд╛рд╕ EventHub.cpp рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ , рд╣рдо рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд▓рд┐рдирдХреНрд╕ рдлреЗрдбреЛрд░рд╛ рдХреА рддрд░рд╣ / рджреЗрд╡ / рдЗрдирдкреБрдЯ рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдЦреЛрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  static const char *DEVICE_PATH = "/dev/input"; //... char devname[PATH_MAX]; char *filename; //... strcpy(devname, DEVICE_PATH); filename = devname + strlen(devname); *filename++ = '/'; //... strcpy(filename, event->name); //... openDeviceLocked(devname); //... status_t EventHub::openDeviceLocked(const char *devicePath) { char buffer[80]; ALOGV("Opening device: %s", devicePath); int fd = open(devicePath, O_RDWR | O_CLOEXEC); if(fd < 0) { ALOGE("could not open %s, %s\n", devicePath, strerror(errno)); return -1; } 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдЗрд╕ рдкреВрд░реЗ рдЗрдирдкреБрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╣реА рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ :

 /* * The input manager is the core of the system event processing. * * The input manager uses two threads. * * 1. The InputReaderThread (called "InputReader") reads and preprocesses raw input events, * applies policy, and posts messages to a queue managed by the DispatcherThread. * 2. The InputDispatcherThread (called "InputDispatcher") thread waits for new events on the * queue and asynchronously dispatches them to applications. * * By design, the InputReaderThread class and InputDispatcherThread class do not share any * internal state. Moreover, all communication is done one way from the InputReaderThread * into the InputDispatcherThread and never the reverse. Both classes may interact with the * InputDispatchPolicy, however. * * The InputManager class never makes any calls into Java itself. Instead, the * InputDispatchPolicy is responsible for performing all external interactions with the * system, including calling DVM services. */ class InputManagerInterface : public virtual RefBase { 

рддреЛ, рд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрддрд┐рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИрдВ:
 #include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <libusb-1.0/libusb.h> #define SONY_VENDOR_ID 0x054C #define PSP_B_PRODUCT_ID 0x01C9 #define UP 0x00000010 #define DOWN 0x00000040 #define LEFT 0x00000080 #define RIGHT 0x00000020 #define B_X 0x00004000 #define B_O 0x00002000 #define B_KVADRAT 0x00008000 #define B_TREUGOLNIK 0x00001000 #define B_L 0x00000100 #define B_R 0x00000200 #define B_SELECT 0x00000001 #define B_START 0x00000008 #define B_NOTE 0x00800000 struct { unsigned int Pattern; unsigned int Btn; unsigned int X; unsigned int Y; } PS = {0x1234ABFE, 0, 127, 127}; struct js_event { unsigned int time; short value; unsigned char type; unsigned char number; }; int is_usbdevblock(libusb_device *dev) { struct libusb_device_descriptor desc; int r = libusb_get_device_descriptor(dev, &desc); if((desc.idVendor == SONY_VENDOR_ID) && (desc.idProduct == PSP_B_PRODUCT_ID)) { return 1; } return 0; } int main(int argc, char** argv) { unsigned int real_x = 0, real_y = 0; int x, y; int fd = 0; while(1) { libusb_device **list; libusb_device *found = NULL; libusb_context *ctx = NULL; int attached = 0; libusb_init(&ctx); libusb_set_debug(ctx, 3); ssize_t cnt = libusb_get_device_list(ctx, &list); ssize_t i = 0; int err = 0; if(cnt < 0) { return -1; } for(i = 0; i < cnt; i++) { libusb_device *device = list[i]; if(is_usbdevblock(device)) { found = device; break; } } if(found) { libusb_device_handle *handle; err = libusb_open(found, &handle); if (err) { return -1; } if (libusb_kernel_driver_active(handle, 0)) { libusb_detach_kernel_driver(handle, 0); attached = 1; } err = libusb_claim_interface(handle, 0); if (err) { return -1; } if(fd == 0) { fd = open("/dev/input/js0", O_RDONLY); } if(fd < 0) { goto clean; } int nEndpoint = 0x01; int nTimeout = 500; //in milliseconds int BytesWritten = 0; int ret; struct js_event e; int t; while(1) { read(fd, &e, sizeof(struct js_event)); e.type &= ~0x80; t = 0; //transfer = 0; if(e.type == 1) { if(e.value == 1) { if(e.number == 0) {PS.Btn |= B_X; t = 1;} if(e.number == 1) {PS.Btn |= B_O; t = 1;} if(e.number == 2) {PS.Btn |= B_KVADRAT; t = 1;} if(e.number == 3) {PS.Btn |= B_TREUGOLNIK; t = 1;} if(e.number == 4) {PS.Btn |= B_L; t = 1;} if(e.number == 5) {PS.Btn |= B_R; t = 1;} if(e.number == 6) {PS.Btn |= B_SELECT; t = 1;} if(e.number == 7) {PS.Btn |= B_START; t = 1;} if(e.number == 8) {PS.Btn |= B_NOTE; t = 1;}//XBOX_HOME //if(e.number == 9) PS.Btn |= ;//L_STICK_PRESS //if(e.number == 10)PS.Btn |= ;//R_STICK_PRESS } if(e.value == 0) { if(e.number == 0) {PS.Btn &= ~B_X; t = 1;} if(e.number == 1) {PS.Btn &= ~B_O; t = 1;} if(e.number == 2) {PS.Btn &= ~B_KVADRAT; t = 1;} if(e.number == 3) {PS.Btn &= ~B_TREUGOLNIK; t = 1;} if(e.number == 4) {PS.Btn &= ~B_L; t = 1;} if(e.number == 5) {PS.Btn &= ~B_R; t = 1;} if(e.number == 6) {PS.Btn &= ~B_SELECT; t = 1;} if(e.number == 7) {PS.Btn &= ~B_START; t = 1;} if(e.number == 8) {PS.Btn &= ~B_NOTE; t = 1;} } } if(e.type == 2) { if(e.number == 6) { if(e.value == -32767) {PS.Btn |= LEFT; t = 1;} if(e.value == 32767) {PS.Btn |= RIGHT; t = 1;} if(e.value == 0) {PS.Btn &= ~(LEFT | RIGHT); t = 1;} } if(e.number == 7) { if(e.value == -32767) {PS.Btn |= UP; t = 1;} if(e.value == 32767) {PS.Btn |= DOWN; t = 1;} if(e.value == 0) {PS.Btn &= ~(UP | DOWN); t = 1;} } if(e.number == 0) { if(real_x != ((e.value + 32767) / 256)) {real_x = ((e.value + 32767) / 256); t = 1;} } if(e.number == 1) { if(real_y != ((e.value + 32767) / 256)) {real_y = ((e.value + 32767) / 256); t = 1;} } } if(t == 1) { #define KOEF 1.4 //[-128..0..127] x = real_x - 128; y = real_y - 128; x = x * (1. + ((abs(x) * (KOEF-1.))/(127./KOEF))); if(x > 127) x = 127; if(x < -128) x = -128; y = y * (1. + ((abs(y) * (KOEF-1.))/(127./KOEF))); if(y > 127) y = 127; if(y < -128) y = -128; PS.X = 128 + x; PS.Y = 128 + y; ret = libusb_bulk_transfer(handle, nEndpoint, (unsigned char *)&PS, sizeof(PS), &BytesWritten, nTimeout); if(ret < 0) { break; } } } clean: if(fd) { close(fd); fd = 0; } if(attached == 1) { libusb_attach_kernel_driver(handle, 0); } libusb_close(handle); } libusb_free_device_list(list, 1); libusb_exit(ctx); sleep(1); } return 0; } 

рдпрд╣рд╛рдБ рд╕реЗрд╡рд╛ рдмрд╛рдЗрдирд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рднреА m.sh рд╕рдВрдХрд▓рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 gcc xbox2psp.c -o xbox2psp.o -I/usr/local -L/usr/local -lusb-1.0 

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


рдЗрд╕рд▓рд┐рдП, рдПрдХ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝ рд░рд╣реА рд╣реИ (Xbox рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдЕрдХреНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд▓рди, рдмрдбрд╝рд╛) рдЧреБрдгрд╛рдВрдХ рдХреЛ рдЕрдзрд┐рдХрддрдо 1.4 рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдпрд╣ рдХреЛрдг рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрдЧрд╛, рдФрд░ рдХреЛрдг рдХреЛ рд╡рд┐рдХрд░реНрдг рдХреЗ рдХрд░реАрдм, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЧреБрдгрд╛рдВрдХ)ред рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, Xbox рдЧреЗрдордкреИрдб рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рддрдХрдиреАрдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рд░реВрдЦреА рдирд┐рдХрд▓реАред рдбреВрдо 0.05 рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдбрдВрдЧрдСрди рдШреЗрд░рд╛рдмрдВрджреА рдореЗрдВ рд╕рднреА рддреАрди рдЖрдВрджреЛрд▓рди рдЧрддрд┐ (рдЫрдбрд╝реА рд╡рд┐рдХреНрд╖реЗрдкрдг рдмрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ PSP рдкрд░ рд╣реА рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (1.5 рдФрд░ 1.4 рджреЛрдиреЛрдВ), рд╡рд┐рдЪрд▓рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реИрдЦрд┐рдХ рд╡реГрджреНрдзрд┐ рдХреЗ рдмрд┐рдирд╛, рдФрд░ рдирд╛рдорд┐рдд рдЦреЗрд▓реЛрдВ рдореЗрдВ рддреЗрдЬ рдЕрд╕реБрд╡рд┐рдзрд╛ рдереА - рдпрд╣ рдЦреЗрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред

рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЗ рд▓рд┐рдП рдлреЗрдбреЛрд░рд╛ рд░реАрдорд┐рдХреНрд╕ 18 рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реЗрд╡рд╛ рдЬреЛрдбрд╝рдирд╛


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

1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рд╕рд░реНрд╡рд┐рд╕ Xbox2psp.o рдХреЛ / usr / рд▓реЛрдХрд▓ / рдмрд┐рди рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рд░рд╛рдЗрдЯреНрд╕ (рддреАрдиреЛрдВ рдмрд┐рдЯреНрд╕) рд╕реЗрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред

2. рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ /lib/systemd/system/xbox2psp.service рдмрдирд╛рдПрдВ:
 [Unit] Description=xbox2psp After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/xbox2psp.o [Install] WantedBy=multi-user.target 

3. / etc / systemd / system / folder рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВ
 > ln -s /lib/systemd/system/xbox2psp.service xbox2psp.service 

4. рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдбреЗрдорди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВ:
 > systemctl daemon-reload 

5. рдПрдХ рдирдИ рд╕реЗрд╡рд╛ рдХреЗ рдСрдЯреЛрд╕реНрдЯрд╛рд░реНрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ
 > systemctl enable xbox2psp.service 

6. рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рддреБрд░рдВрдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 > systemctl start xbox2psp.service 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ Xbox 360 рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PSP рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд▓реВрдЯреВрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреНрдпреВрд▓рд╢реЙрдХ 3ред

Source: https://habr.com/ru/post/In213513/


All Articles