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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдиреНрдпреВрд╣рд╛рд╡реЗрдиреНрдбрд┐рд╕рдкреНрд▓реЗрдЬрд╝ рд╕реЗ 320x240 рд░рдВрдЧ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдирдХреНрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддреН рдПрдореНрдмреЗрдбреЗрдб рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП NHD-5.7-320240WFB-CTXI-T1ред рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдареАрдХ рд╕реЗ рдкрдХ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░реЗрдордмреБрдлрд░ (рдПрдлрдмреА) рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рд░реВрд╕реА рдореЗрдВред рдореЙрдбреНрдпреВрд▓ рдирд╡реАрдирддрдо рдХрд░реНрдиреЗрд▓ (2.6.30) рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рддрдм рд╕реЗ рдПрдлрдмреА рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рд▓рд╛рдЗрдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдореИрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред





рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХрд╛рд░реНрдп рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрдирд╛ рдерд╛ рдЬрд┐рд╕реЗ рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдЬреИрд╕реЗ рдХреНрдпреВрдЯреА рдПрдореНрдмреЗрдбреЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдЗрдХрди рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдордВрдЪ AT91SAM9G45 рдкрд░ рдПрдХ рджреБрдкрдЯреНрдЯрд╛ рдерд╛, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ www.armdevs.com/IPC-SAM9G45.html
рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рдереАред AT91SAM9G45 рдореЗрдВ рдбреАрдПрдордП рд╕рдорд░реНрдерди рдФрд░ рдПрдХ рдЙрдЪреНрдЪ рдЧрддрд┐ рд╡рд╛рд▓реА рдмрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрд▓рд╕реАрдбреА рдирд┐рдпрдВрддреНрд░рдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╕рднреНрдп рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдпрд╣ SSD1963 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп GPIO рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

SSD1963 рдирд┐рдпрдВрддреНрд░рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕

рдХрдВрдЯреНрд░реЛрд▓рд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕рд╢реАрдЯ рд╕реЗ рдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ:



рдбреНрд░рд╛рдЗрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдо DB0 - DB7 рдкрд┐рди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ 8-рдмрд┐рдЯ рдбреЗрдЯрд╛ рдмрд╕ рд╣реИ, рдФрд░ DC, RD, WR, CS, RES рдкрд┐рди рдЬреЛ SSD1963 рдХреЛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдбрд┐рд╕реНрдкреНрд▓реЗ 888 рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ: 8 рдмрд╛рдЗрдЯреНрд╕ - рд▓рд╛рд▓, 8 рдмрд╛рдЗрдЯреНрд╕ - рд╣рд░рд╛, 8 рдмрд╛рдЗрдЯреНрд╕ - рдиреАрд▓рд╛ред рдЕрднреА рднреА рдЕрдХреНрд╕рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдЖрдк рд╡рд┐рдХрд▓реНрдк 555, 565 рдЖрджрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрдЪрд░рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдмрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рд╕реЗрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, CS рдФрд░ WR рдкрд┐рди 1 рд╕реЗ 0. рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЗрдЯрд╛ рдмрд╛рдЗрдЯ рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, CS рдФрд░ WR рдХреЛ 0 рд╕реЗ 1 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдЗрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред SSD1963 рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдбреЗрдЯрд╛ред рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рддрд░рдВрдЧреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдбреЗрдЯрд╛рд╢реАрдЯ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред www.newhavendisplay.com/app_notes/SSD1963.pdf

рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рд╣рдо GPIO рдкрд┐рди рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
static unsigned int nhd_data_pin_config[] = { AT91_PIN_PE13, AT91_PIN_PE14, AT91_PIN_PE17, AT91_PIN_PE18, AT91_PIN_PE19, AT91_PIN_PE20, AT91_PIN_PE21, AT91_PIN_PE22 }; static unsigned int nhd_gpio_pin_config[] = { AT91_PIN_PE0, // RESET AT91_PIN_PE2, // DC AT91_PIN_PE5, // CLK AT91_PIN_PE6, // RD AT91_PIN_PE1 // WR }; 


рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдмрд╛рдЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:

 static void nhd_write_data(int command, unsigned short value) { int i; at91_set_gpio_output(AT91_PIN_PE12, 1); //R/D for (i=0; i<ARRAY_SIZE(nhd_data_pin_config); i++) at91_set_gpio_output(nhd_data_pin_config[i], (value>>i)&0x01); if (command) at91_set_gpio_output(AT91_PIN_PE10, 0); //D/C else at91_set_gpio_output(AT91_PIN_PE10, 1); //D/C at91_set_gpio_output(AT91_PIN_PE11, 0); //WR at91_set_gpio_output(AT91_PIN_PE26, 0); //CS at91_set_gpio_output(AT91_PIN_PE26, 1); //CS at91_set_gpio_output(AT91_PIN_PE11, 1); //WR } 


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

рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдХреЛрд░ рдореЙрдбрд▓

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдЪрд╛рд░ рдбреНрд░рд╛рдЗрд╡рд░, рдмреНрд▓реЙрдХ рдбреНрд░рд╛рдЗрд╡рд░, рдпреВрдПрд╕рдмреА рдЪрд╛рд▓рдХ, рдЖрджрд┐ред рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдирдХреНрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЙрдкрддрдВрддреНрд░ рднреА рд╣реИред FB рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рд╕рдВрд░рдЪрдирд╛ linux / fb.h рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ fb_info рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ рд╣рд╛рд╕реНрдп рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд░реВрдЪрд┐ рд▓реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╣рд╛рдиреА рд╢рд╛рдорд┐рд▓ рд╣реИ -
#define STUPID_ACCELF_TEXT_SHIT рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ fb_info рд╕рдВрд░рдЪрдирд╛ рдореЗрдВред рд╣рдо рджреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ - fb_var_screeninfo рдФрд░ fb_fix_screeninfo ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред

 static struct fb_fix_screeninfo ssd1963_fix __initdata = { .id = "SSD1963", .type = FB_TYPE_PACKED_PIXELS, .visual = FB_VISUAL_TRUECOLOR, .accel = FB_ACCEL_NONE, .line_length = 320 * 4, }; static struct fb_var_screeninfo ssd1963_var __initdata = { .xres = 320, .yres = 240, .xres_virtual = 320, .yres_virtual = 240, .width = 320, .height = 240, .bits_per_pixel = 32, .transp = {24, 8, 0}, .red = {16, 8, 0}, .green = {8, 8, 0}, .blue = {0, 8, 0}, .activate = FB_ACTIVATE_NOW, .vmode = FB_VMODE_NONINTERLACED, }; 


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 4 рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ: 8-рд░реЗрдб, 8-рдЧреНрд░реАрди, 8-рдмреНрд▓реВ, 8-рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрдЯ
рдореИрдВ рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВрдЧрд╛:

.type рдмрд┐рдЯреНрд╕ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдЯреНрд╕ рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдкреИрдХреНрдб рдкрд┐рдХреНрд╕рд▓ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯреНрд╕ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 8888 рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛)ред

.visual - рдкреНрд░рджрд░реНрд╢рди рд░рдВрдЧ рдЧрд╣рд░рд╛рдИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЯреНрд░реВрдХреЙрд▓рд░ рд╣реИ - 24 рдмрд┐рдЯ рд░рдВрдЧ рдЧрд╣рд░рд╛рдИ

.accel - рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг

.transp, рд▓рд╛рд▓, рд╣рд░рд╛, рдиреАрд▓рд╛ - рдмрд╕ рд╣рдорд╛рд░реЗ 8,8,8,8 рдкреНрд░рд╛рд░реВрдк рдХреЛ рддреАрди рдХреНрд╖реЗрддреНрд░реЛрдВ - рдСрдлрд╕реЗрдЯ, рд▓рдВрдмрд╛рдИ рдФрд░ msb_right рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдФрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ - рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдФрд░ рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо FB рдбрд┐рд╡рд╛рдЗрд╕ ( рд╕реНрдЯреНрд░рдХреНрдЪрд░ ssd1963 ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реА рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреЗ рдкреЗрдЬ рд╣реЛрдВрдЧреЗ ( рд╕реНрдЯреНрд░рдХреНрдЪрд░ ss1963- рдкреЗрдЬ ):

 struct ssd1963_page { unsigned short x; unsigned short y; unsigned long *buffer; unsigned short len; int must_update; }; struct ssd1963 { struct device *dev; struct fb_info *info; unsigned int pages_count; struct ssd1963_page *pages; }; struct platform_driver ssd1963_driver = { .probe = ssd1963_probe, .remove = ssd1963_remove, .driver = { .name = "ssd1963" } }; 


рдкреНрд░рд╛рд░рдВрдн

рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде, рд╣рдо init / remove рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП init рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдбреНрд░рд╛рдЗрд╡рд░ рдЖрдорддреМрд░ рдкрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо_рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ:

 static int __init ssd1963_init(void) { int ret = 0; ret = platform_driver_register(&ssd1963_driver); if (ret) { pr_err("%s: unable to platform_driver_register\n", __func__); } return ret; } module_init(ssd1963_init); 


рдордВрдЪ рдЪрд╛рд▓рдХ, рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд╛рд▓рдХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ - рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди, рд╕рдВрд╕рд╛рдзрди рдЖрд░рдХреНрд╖рдг, рд╕рдВрд░рдЪрдирд╛ рдЖрд░рдВрднреАрдХрд░рдг, рдЖрджрд┐ред рдпрд╣рд╛рдБ ssd1963_probe рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 static int __init ssd1963_probe(struct platform_device *dev) { int ret = 0; struct ssd1963 *item; struct fb_info *info; // Allocating memory for ssd1663 device item = kzalloc(sizeof(struct ssd1963), GFP_KERNEL); if (!item) { dev_err(&dev->dev, "%s: unable to kzalloc for ssd1963\n", __func__); ret = -ENOMEM; goto out; } item->dev = &dev->dev; dev_set_drvdata(&dev->dev, item); // Initializing fb_info struct using kernel framebuffer API info = framebuffer_alloc(sizeof(struct ssd1963), &dev->dev); if (!info) { ret = -ENOMEM; dev_err(&dev->dev, "%s: unable to framebuffer_alloc\n", __func__); goto out_item; } item->info = info; //Here info->par pointer is commonly used to store private data // In our case, we can use it to store pointer to ssd1963 device info->par = item; info->dev = &dev->dev; info->fbops = &ssd1963_fbops; info->flags = FBINFO_FLAG_DEFAULT; info->fix = ssd1963_fix; info->var = ssd1963_var; ret = ssd1963_video_alloc(item); if (ret) { dev_err(&dev->dev, "%s: unable to ssd1963_video_alloc\n", __func__); goto out_info; } info->screen_base = (char __iomem *)item->info->fix.smem_start; ret = ssd1963_pages_alloc(item); if (ret < 0) { dev_err(&dev->dev, "%s: unable to ssd1963_pages_init\n", __func__); goto out_video; } info->fbdefio = &ssd1963_defio; fb_deferred_io_init(info); ret = register_framebuffer(info); if (ret < 0) { dev_err(&dev->dev, "%s: unable to register_frambuffer\n", __func__); goto out_pages; } ssd1963_setup(item); ssd1963_update_all(item); return ret; out_pages: ssd1963_pages_free(item); out_video: ssd1963_video_free(item); out_info: framebuffer_release(info); out_item: kfree(item); out: return ret; } 


рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВред рдпрд╣рд╛рдБ рд╣рдо рдХреНрд░рдо рдореЗрдВ рд╣реИрдВ:
- рд╣рдорд╛рд░реЗ ssd1963 рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ
- рд╣рдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ (рдлреНрд░реЗрдордмрдлрд╝рд░_рд▓реЙрдХ) рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ fb_info рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдЬреИрд╕реЗ рдХрд┐ fb_var_screeninfo, fb_fix_screeninfo рдФрд░ fb_ops , рдЬреЛ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
- рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдирд┐рд░рдВрддрд░ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП ssd1963_page рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ ssd1963_page рдореЗрдВ рд╕рд╛рдЭрд╛ рдПрдлрдмреА рдмрдлрд░, рдПрдХ рдПрдХреНрд╕ рдСрдлрд╕реЗрдЯ, рдПрдХ рд╡рд╛рдИ рдСрдлрд╕реЗрдЯ рдФрд░ рдПрдХ рдкреЗрдЬ рдмрдлрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреГрд╖реНрда рдмрдлрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдХреНрд╖рдорддрд╛ = рд▓рд╛рдЗрди_рд▓реЗрдВрде * рдКрдВрдЪрд╛рдИ = 320 * 4 * 240 = 307200 рдмрд╛рдЗрдЯреНрд╕ред рдРрд╕реА рдмрдлрд░ рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ line_length * рдКрдВрдЪрд╛рдИ / PAGE_SIZE = 307200/4096 = 75 рдкреГрд╖реНрда рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реЗ рдПрдлрдмреА рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж ssd1963_copy рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрдиреЗ рдкрд░ рдЗрд╕ рдкреГрд╖реНрда рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:



- рд╣рдо рдЕрдкрдиреЗ FB рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ ( register_framebuffer ) рдФрд░ рдЖрд╕реНрдердЧрд┐рдд рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ ( fb_deferred_io_init ) рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ "рд╕реЗрдХреНрд╢рди" рдлреНрд░реЗрдордмрдлрд╝рд░ рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди "рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХред
- ssd1963_setup AT91SAM9G45 CPU рдкрд░ рдЖрд╡рд╢реНрдпрдХ GPIO рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрд▓рд╕реАрдбреА рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕реЗрдЯрдЕрдк рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣реЗрдХреНрд╕ рдореЗрдВ рд░рд╣рд╕реНрдпрдордп рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо SSD1963 рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджреВрдВрдЧрд╛:

  void ssd1963_setup(struct ssd1963 *item) { nhd_init_gpio_regs(); //initializations of pins in nhd_data-gpio_pin_config at91_set_gpio_output(AT91_PIN_PE27, 0); //RESET udelay(5); at91_set_gpio_output(AT91_PIN_PE27, 1); //RESET udelay(100); nhd_write_data(NHD_COMMAND, 0x01); //Software Reset ... nhd_write_to_register(0xe0, 0x03); //LOCK PLL nhd_write_data(NHD_COMMAND, 0xb0); //SET LCD MODE TFT 18Bits nhd_write_data(NHD_DATA, 0x0c); //SET MODE 24 bits & hsync+Vsync+DEN тАж } 


- ssd1963_update_all рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП must_update = 1 рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реЗрдбреНрдпреВрд▓_рдбреЗрд▓рдПрдб_рд╡рд░реНрдХ ((рдордж-> рдЬрд╛рдирдХрд╛рд░реА- deferred_work, fbdefio-> рджреЗрд░реА) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдЕрджреНрдпрддрди рддрдВрддреНрд░ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ ;

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдирд┐рд╖реНрдХрд╛рд╕рди рдХрд╛рд░реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВ, рдФрд░ kB рдХреЛ рдПрдлрдмреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдВ:

 static int ssd1963_remove(struct platform_device *device) { struct fb_info *info = platform_get_drvdata(device); struct ssd1963 *item = (struct ssd1963 *)info->par; if (info) { unregister_framebuffer(info); ssd1963_pages_free(item); ssd1963_video_free(item); framebuffer_release(info); kfree(item); } return 0; } 

рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рд╕рдВрдЪрд╛рд▓рди

рддреЛ, рдпрд╣ fb_ops рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

 static struct fb_ops ssd1963_fbops = { .owner = THIS_MODULE, .fb_read = fb_sys_read, .fb_write = ssd1963_write, .fb_fillrect = ssd1963_fillrect, .fb_copyarea = ssd1963_copyarea, .fb_imageblit = ssd1963_imageblit, .fb_setcolreg = ssd1963_setcolreg, .fb_blank = ssd1963_blank, }; 


рдореИрдВ рдпрд╣рд╛рдВ рд╕рднреА рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рджреЗрддрд╛, рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдкрд╛рдардХ рдЙрдиреНрд╣реЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдпрд╛ рдбреНрд░рд╛рдЗрд╡рд░ / рд╡реАрдбрд┐рдпреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдвреВрдВрдврдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, fb_ops рд╕рдВрд░рдЪрдирд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрд░реНрдиреЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ sb_ рдпрд╛ fb_sys рдкреНрд░рддреНрдпрдп рдХреЗ рд╕рд╛рде FB рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХреЛ рд╕реБрдЧрдо рдмрдирд╛рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП fb_sys_read ред рд╣рдореЗрдВ рд╕рд┐рд░реНрдл fb_ops ( ssd1963_read, ssd1963_write , рдЖрджрд┐) рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рд╣рдорд╛рд░реЗ impromptu рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ssd1963_fillrect рдлрдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 static void ssd1963_fillrect(struct fb_info *p, const struct fb_fillrect *rect) { sys_fillrect(p, rect); ssd1963_touch(p, rect->dx, rect->dy, rect->width, rect->height); } 


рдЬрд╛рд╣рд┐рд░ рд╣реИ, fb_fillrect system рдХреЙрд▓ рд╡реАрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ , рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рди рдкреГрд╖реНрдареЛрдВ рдХреЛ must_update рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдЕрдкрдбреЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 static void ssd1963_touch(struct fb_info *info, int x, int y, int w, int h) { struct fb_deferred_io *fbdefio = info->fbdefio; struct ssd1963 *item = (struct ssd1963 *)info->par; int i, ystart, yend; if (fbdefio) { //Touch the pages, so the deferred io will update them. for (i=0; i<item->pages_count; i++) { ystart=item->pages[i].y; yend=item->pages[i].y+(item->pages[i].len/info->fix.line_length)+1; if (!((y+h)<ystart || y>yend)) { item->pages[i].must_update=1; } } //Schedule the deferred IO to kick in after a delay. schedule_delayed_work(&info->deferred_work, fbdefio->delay); } } 


рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдпреВрдЬрд░-рд╕реНрдкреЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИред Fb_info рдореЗрдВ рд╕реНрдердЧрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ fb_deferred_io рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 static struct fb_deferred_io ssd1963_defio = { .delay = HZ / 20, .deferred_io = &ssd1963_update, }; 

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде Ssd1963_update рдлрд╝рдВрдХреНрд╢рди
void ssd1963_update (рд╕рдВрд░рдЪрдирд╛ fb_info * рдЬрд╛рдирдХрд╛рд░реА, рд╕рдВрд░рдЪрдирд╛ list_head * pagelist);
рдпрд╣ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЛ рддрд╛рдЬрд╝рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдерд╛рди рдХреЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬреИрд╕реЗ рдХрд┐ fb_fillrect рдФрд░ рдХрдВрдкрдиреА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдП рдЧрдП рдкреГрд╖реНрдаред рддрджрдиреБрд╕рд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░реВрдк рд╣реИ:

 static void ssd1963_update(struct fb_info *info, struct list_head *pagelist) { struct ssd1963 *item = (struct ssd1963 *)info->par; struct page *page; int i; list_for_each_entry(page, pagelist, lru) { item->pages[page->index].must_update=1; } //Copy changed pages. for (i=0; i<item->pages_count; i++) { if (item->pages[i].must_update) { item->pages[i].must_update=0; ssd1963_copy(item, i); } } } 


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

Ssd1963_copy рдлрд╝рдВрдХреНрд╢рди

рдпрд╣рд╛рдВ рдЙрд╕ рдЖрдВрдХрдбрд╝реЗ рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреЗрдЬ рдбрд┐рд╕реНрдкреНрд▓реЗ рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдкреГрд╖реНрда [0] 320 рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рддреАрди рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЗрдиреЛрдВ рдФрд░ 4 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 64 рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ 75 рдкреГрд╖реНрда рд╣реИрдВ, рдФрд░ рдЪрд┐рддреНрд░ рд╕реЗ рдЪрд┐рддреНрд░ рд╣реИ, рдФрд░ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдкреГрд╖реНрда [5] 320 рдХреА 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ - 64 рдореЗрдВ рд╕реЗ рдПрдХ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реНрд╡рд┐рдЪ (рдЗрдВрдбреЗрдХреНрд╕%) рд╣реЛрдЧрд╛ред 5) рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкреНрд░рджрд░реНрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рдЗрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд "рд╡рд┐рдВрдбреЛ" рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬреЗрдВред рд╕рдорд╛рд░реЛрд╣ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рджреВрдВрдЧрд╛:

 static void ssd1963_copy(struct ssd1963 *item, unsigned int index) { unsigned short x,y, startx, endx, starty, endy, offset; unsigned long *buffer; unsigned int len; unsigned int count; x = item->pages[index].x; y = item->pages[index].y; buffer = item->pages[index].buffer; len = item->pages[index].len; switch (index%5) { case 0: offset = 0; startx = x; starty = y; endx = 319; endy = y+2; len = 960; nhd_set_window(startx, endx, starty, endy); nhd_write_data(NHD_COMMAND, 0x2c); for (count = 0; count < len; count++) { nhd_write_data(NHD_DATA,(unsigned char)((buffer[count+offset])>>16)); //red nhd_write_data(NHD_DATA,(unsigned char)((buffer[count+offset])>>8)); //green nhd_write_data(NHD_DATA,(unsigned char)(buffer[count+offset])); //blue } offset = len; startx = x; starty = y+3; endx = x+63; endy = y+3; len = 64; nhd_set_window(startx, endx, starty, endy); nhd_write_data(NHD_COMMAND, 0x2c); for (count = 0; count < len; count++) { nhd_write_data(NHD_DATA,(unsigned char)((buffer[count+offset])>>16)); //red nhd_write_data(NHD_DATA,(unsigned char)((buffer[count+offset])>>8)); //green nhd_write_data(NHD_DATA,(unsigned char)(buffer[count+offset])); //blue } break; case 1: тАж. 


рдпрд╣рд╛рдБ, nhd_set_window рдлрд╝рдВрдХреНрд╢рди nhd_write_data (NHD_COMMAND, ...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ; рдкреНрд░рджрд░реНрд╢рди рдХреНрд╖реЗрддреНрд░ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ (рдкрд┐рдХреНрд╕реЗрд▓) рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
nhd_write_data (NHD_COMMAND, 0x2c); - рдПрд▓рд╕реАрдбреА рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдПрдХ рдХрдорд╛рдВрдб рдЬреЛ рдЕрдм рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ tslib рдкреИрдХреЗрдЬ рд╕реЗ ts_calibrate рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВ:

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


All Articles