Комментарии 16
У меня на похожей плате можно управлять дисплеем через FSMC, при этом дисплей, по сути, маппится в память. Этот способ взаимодействия мне кажется более простым и элегантным, чем дёрганье ножками МК. Может быть и у вас так можно?
Да, в теории возможно, хочу попробовать. Просто не факт, что успею до конца года, т. к. рабочий аврал может поставить крест на хоббийных делах.

Datasheet контроллера дисплея местами очень shit, надо корректно выбрать тайминги. Объем конфигурации можно оценить в функции lcd_init. =)

Как реализую на FMSC — напишу ещё пост. Будет повод прикрутить поддержку microSD с DMA-блиттингом. С точки зрения описанных выше интерфейсов — поменяется низкоуровневый API, что не критично.
Datasheet контроллера дисплея местами очень shit, надо корректно выбрать тайминги. Объем конфигурации можно оценить в функции lcd_init. =)

Только у вас он маленький весьма получился. А вот у меня в примере работы с контроллером написано вот это:
LCD_Initializtion()
void LCD_Initializtion()
{
  LCD_Configuration();
  LCD_Delay(5);  /* delay 50 ms */		
  DeviceCode = LCD_ReadReg(0x0000);		/* ╢┴╚í╞┴ID	*/
  if(DeviceCode==0x9325 || DeviceCode==0x9328)	/* ▓╗═¼╞┴╟²╢»IC │⌡╩╝╗»▓╗═¼ */
  {
    LCD_WriteReg(0x00e7,0x0010);      
    LCD_WriteReg(0x0000,0x0001);  	/* start internal osc */
    LCD_WriteReg(0x0001,0x0100);     
    LCD_WriteReg(0x0002,0x0700); 	/* power on sequence */
	LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4)|(0<<3) ); 	/* importance */
    LCD_WriteReg(0x0004,0x0000);                                   
    LCD_WriteReg(0x0008,0x0207);	           
    LCD_WriteReg(0x0009,0x0000);         
    LCD_WriteReg(0x000a,0x0000); 	/* display setting */        
    LCD_WriteReg(0x000c,0x0001);	/* display setting */        
    LCD_WriteReg(0x000d,0x0000); 			        
    LCD_WriteReg(0x000f,0x0000);
    /* Power On sequence */
    LCD_WriteReg(0x0010,0x0000);   
    LCD_WriteReg(0x0011,0x0007);
    LCD_WriteReg(0x0012,0x0000);                                                                 
    LCD_WriteReg(0x0013,0x0000);                 
    LCD_Delay(5);  /* delay 50 ms */		
    LCD_WriteReg(0x0010,0x1590);   
    LCD_WriteReg(0x0011,0x0227);
    LCD_Delay(5);  /* delay 50 ms */		
    LCD_WriteReg(0x0012,0x009c);                  
    LCD_Delay(5);  /* delay 50 ms */		
    LCD_WriteReg(0x0013,0x1900);   
    LCD_WriteReg(0x0029,0x0023);
    LCD_WriteReg(0x002b,0x000e);
    LCD_Delay(5);  /* delay 50 ms */		
    LCD_WriteReg(0x0020,0x0000);                                                            
    LCD_WriteReg(0x0021,0x0000);           
    LCD_Delay(5);  /* delay 50 ms */		
    LCD_WriteReg(0x0030,0x0007); 
    LCD_WriteReg(0x0031,0x0707);   
    LCD_WriteReg(0x0032,0x0006);
    LCD_WriteReg(0x0035,0x0704);
    LCD_WriteReg(0x0036,0x1f04); 
    LCD_WriteReg(0x0037,0x0004);
    LCD_WriteReg(0x0038,0x0000);        
    LCD_WriteReg(0x0039,0x0706);     
    LCD_WriteReg(0x003c,0x0701);
    LCD_WriteReg(0x003d,0x000f);
    LCD_Delay(5);  /* delay 50 ms */		
    LCD_WriteReg(0x0050,0x0000);        
    LCD_WriteReg(0x0051,0x00ef);   
    LCD_WriteReg(0x0052,0x0000);     
    LCD_WriteReg(0x0053,0x013f);
    LCD_WriteReg(0x0060,0xa700);        
    LCD_WriteReg(0x0061,0x0001); 
    LCD_WriteReg(0x006a,0x0000);
    LCD_WriteReg(0x0080,0x0000);
    LCD_WriteReg(0x0081,0x0000);
    LCD_WriteReg(0x0082,0x0000);
    LCD_WriteReg(0x0083,0x0000);
    LCD_WriteReg(0x0084,0x0000);
    LCD_WriteReg(0x0085,0x0000);
      
    LCD_WriteReg(0x0090,0x0010);     
    LCD_WriteReg(0x0092,0x0000);  
    LCD_WriteReg(0x0093,0x0003);
    LCD_WriteReg(0x0095,0x0110);
    LCD_WriteReg(0x0097,0x0000);        
    LCD_WriteReg(0x0098,0x0000);  
    /* display on sequence */    
    LCD_WriteReg(0x0007,0x0133);
    
    LCD_WriteReg(0x0020,0x0000);  /* ╨╨╩╫╓╖0 */                                                          
    LCD_WriteReg(0x0021,0x0000);  /* ┴╨╩╫╓╖0 */     
  }
  else if(DeviceCode==0x9320 || DeviceCode==0x9300)
  {
    LCD_WriteReg(0x00,0x0000);
	LCD_WriteReg(0x01,0x0100);	/* Driver Output Contral */
	LCD_WriteReg(0x02,0x0700);	/* LCD Driver Waveform Contral */
	LCD_WriteReg(0x03,0x1018);	/* Entry Mode Set */
	
	LCD_WriteReg(0x04,0x0000);	/* Scalling Contral */
    LCD_WriteReg(0x08,0x0202);	/* Display Contral */
	LCD_WriteReg(0x09,0x0000);	/* Display Contral 3.(0x0000) */
	LCD_WriteReg(0x0a,0x0000);	/* Frame Cycle Contal.(0x0000) */
    LCD_WriteReg(0x0c,(1<<0));	/* Extern Display Interface Contral */
	LCD_WriteReg(0x0d,0x0000);	/* Frame Maker Position */
	LCD_WriteReg(0x0f,0x0000);	/* Extern Display Interface Contral 2. */
	
    LCD_Delay(10);  /* delay 100 ms */		
	LCD_WriteReg(0x07,0x0101);	/* Display Contral */
    LCD_Delay(10);  /* delay 100 ms */		

	LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4));	/* Power Control 1.(0x16b0)	*/
	LCD_WriteReg(0x11,0x0007);								/* Power Control 2 */
	LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0));				/* Power Control 3.(0x0138)	*/
	LCD_WriteReg(0x13,0x0b00);								/* Power Control 4 */
	LCD_WriteReg(0x29,0x0000);								/* Power Control 7 */
	
	LCD_WriteReg(0x2b,(1<<14)|(1<<4));
		
	LCD_WriteReg(0x50,0);       /* Set X Start */
	LCD_WriteReg(0x51,239);	    /* Set X End */
	LCD_WriteReg(0x52,0);	    /* Set Y Start */
	LCD_WriteReg(0x53,319);	    /* Set Y End */
	
	LCD_WriteReg(0x60,0x2700);	/* Driver Output Control */
	LCD_WriteReg(0x61,0x0001);	/* Driver Output Control */
	LCD_WriteReg(0x6a,0x0000);	/* Vertical Srcoll Control */
	
	LCD_WriteReg(0x80,0x0000);	/* Display Position? Partial Display 1 */
	LCD_WriteReg(0x81,0x0000);	/* RAM Address Start? Partial Display 1 */
	LCD_WriteReg(0x82,0x0000);	/* RAM Address End-Partial Display 1 */
	LCD_WriteReg(0x83,0x0000);	/* Displsy Position? Partial Display 2 */
	LCD_WriteReg(0x84,0x0000);	/* RAM Address Start? Partial Display 2 */
	LCD_WriteReg(0x85,0x0000);	/* RAM Address End? Partial Display 2 */
	
    LCD_WriteReg(0x90,(0<<7)|(16<<0));	/* Frame Cycle Contral.(0x0013)	*/
	LCD_WriteReg(0x92,0x0000);	/* Panel Interface Contral 2.(0x0000) */
	LCD_WriteReg(0x93,0x0001);	/* Panel Interface Contral 3. */
    LCD_WriteReg(0x95,0x0110);	/* Frame Cycle Contral.(0x0110)	*/
	LCD_WriteReg(0x97,(0<<8));	
	LCD_WriteReg(0x98,0x0000);	/* Frame Cycle Contral */

    LCD_WriteReg(0x07,0x0173);
  }
  else if(DeviceCode==0x9331)
  {
	LCD_WriteReg(0x00E7, 0x1014);
	LCD_WriteReg(0x0001, 0x0100);   /* set SS and SM bit */
	LCD_WriteReg(0x0002, 0x0200);   /* set 1 line inversion */
	LCD_WriteReg(0x0003, 0x1030);   /* set GRAM write direction and BGR=1 */
	LCD_WriteReg(0x0008, 0x0202);   /* set the back porch and front porch */
    LCD_WriteReg(0x0009, 0x0000);   /* set non-display area refresh cycle ISC[3:0] */
	LCD_WriteReg(0x000A, 0x0000);   /* FMARK function */
	LCD_WriteReg(0x000C, 0x0000);   /* RGB interface setting */
	LCD_WriteReg(0x000D, 0x0000);   /* Frame marker Position */
	LCD_WriteReg(0x000F, 0x0000);   /* RGB interface polarity */
	/* Power On sequence */
	LCD_WriteReg(0x0010, 0x0000);   /* SAP, BT[3:0], AP, DSTB, SLP, STB	*/
	LCD_WriteReg(0x0011, 0x0007);   /* DC1[2:0], DC0[2:0], VC[2:0] */
	LCD_WriteReg(0x0012, 0x0000);   /* VREG1OUT voltage	*/
	LCD_WriteReg(0x0013, 0x0000);   /* VDV[4:0] for VCOM amplitude */
    LCD_Delay(20);                  /* delay 200 ms */		
	LCD_WriteReg(0x0010, 0x1690);   /* SAP, BT[3:0], AP, DSTB, SLP, STB	*/
	LCD_WriteReg(0x0011, 0x0227);   /* DC1[2:0], DC0[2:0], VC[2:0] */
    LCD_Delay(5);                   /* delay 50 ms */		
	LCD_WriteReg(0x0012, 0x000C);   /* Internal reference voltage= Vci	*/
    LCD_Delay(5);                    /* delay 50 ms */		
	LCD_WriteReg(0x0013, 0x0800);   /* Set VDV[4:0] for VCOM amplitude */
	LCD_WriteReg(0x0029, 0x0011);   /* Set VCM[5:0] for VCOMH */
	LCD_WriteReg(0x002B, 0x000B);   /* Set Frame Rate */
    LCD_Delay(5);                   /* delay 50 ms */		
	LCD_WriteReg(0x0020, 0x0000);   /* GRAM horizontal Address */
	LCD_WriteReg(0x0021, 0x0000);   /* GRAM Vertical Address */
	/* Adjust the Gamma Curve */
	LCD_WriteReg(0x0030, 0x0000);
	LCD_WriteReg(0x0031, 0x0106);
	LCD_WriteReg(0x0032, 0x0000);
	LCD_WriteReg(0x0035, 0x0204);
	LCD_WriteReg(0x0036, 0x160A);
	LCD_WriteReg(0x0037, 0x0707);
	LCD_WriteReg(0x0038, 0x0106);
	LCD_WriteReg(0x0039, 0x0707);
	LCD_WriteReg(0x003C, 0x0402);
	LCD_WriteReg(0x003D, 0x0C0F);
	/* Set GRAM area */
	LCD_WriteReg(0x0050, 0x0000);   /* Horizontal GRAM Start Address */
	LCD_WriteReg(0x0051, 0x00EF);   /* Horizontal GRAM End Address */
	LCD_WriteReg(0x0052, 0x0000);   /* Vertical GRAM Start Address */
	LCD_WriteReg(0x0053, 0x013F);   /* Vertical GRAM Start Address */
	LCD_WriteReg(0x0060, 0x2700);   /* Gate Scan Line */
	LCD_WriteReg(0x0061, 0x0001);   /*  NDL,VLE, REV */
	LCD_WriteReg(0x006A, 0x0000);   /* set scrolling line */
	/* Partial Display Control */
	LCD_WriteReg(0x0080, 0x0000);
	LCD_WriteReg(0x0081, 0x0000);
	LCD_WriteReg(0x0082, 0x0000);
	LCD_WriteReg(0x0083, 0x0000);
	LCD_WriteReg(0x0084, 0x0000);
	LCD_WriteReg(0x0085, 0x0000);
	/* Panel Control */
	LCD_WriteReg(0x0090, 0x0010);
	LCD_WriteReg(0x0092, 0x0600);
	LCD_WriteReg(0x0007,0x0021);		
    LCD_Delay(5);                   /* delay 50 ms */		
	LCD_WriteReg(0x0007,0x0061);
    LCD_Delay(5);                   /* delay 50 ms */		
	LCD_WriteReg(0x0007,0x0133);    /* 262K color and display ON */
    LCD_Delay(5);                   /* delay 50 ms */		
  }
  else if(DeviceCode==0x9919)
  {
    /* POWER ON &RESET DISPLAY OFF */
	LCD_WriteReg(0x28,0x0006);
	LCD_WriteReg(0x00,0x0001);		
	LCD_WriteReg(0x10,0x0000);		
	LCD_WriteReg(0x01,0x72ef);
	LCD_WriteReg(0x02,0x0600);
	LCD_WriteReg(0x03,0x6a38);	
	LCD_WriteReg(0x11,0x6874);
	LCD_WriteReg(0x0f,0x0000);    /* RAM WRITE DATA MASK */
	LCD_WriteReg(0x0b,0x5308);    /* RAM WRITE DATA MASK */
	LCD_WriteReg(0x0c,0x0003);
	LCD_WriteReg(0x0d,0x000a);
	LCD_WriteReg(0x0e,0x2e00);  
	LCD_WriteReg(0x1e,0x00be);
	LCD_WriteReg(0x25,0x8000);
	LCD_WriteReg(0x26,0x7800);
	LCD_WriteReg(0x27,0x0078);
	LCD_WriteReg(0x4e,0x0000);
	LCD_WriteReg(0x4f,0x0000);
	LCD_WriteReg(0x12,0x08d9);
	/* Adjust the Gamma Curve */
	LCD_WriteReg(0x30,0x0000);
	LCD_WriteReg(0x31,0x0104);	 
	LCD_WriteReg(0x32,0x0100);	
    LCD_WriteReg(0x33,0x0305);	
    LCD_WriteReg(0x34,0x0505);	 
	LCD_WriteReg(0x35,0x0305);	
    LCD_WriteReg(0x36,0x0707);	
    LCD_WriteReg(0x37,0x0300);	
	LCD_WriteReg(0x3a,0x1200);	
	LCD_WriteReg(0x3b,0x0800);		 
    LCD_WriteReg(0x07,0x0033);
  }
  else if(DeviceCode==0x1505)
  {
    /* second release on 3/5  ,luminance is acceptable,water wave appear during camera preview */
    LCD_WriteReg(0x0007,0x0000);
    LCD_Delay(5);                   /* delay 50 ms */		
    LCD_WriteReg(0x0012,0x011C);    /* why need to set several times?	*/
    LCD_WriteReg(0x00A4,0x0001);    /* NVM */
    LCD_WriteReg(0x0008,0x000F);
    LCD_WriteReg(0x000A,0x0008);
    LCD_WriteReg(0x000D,0x0008);    
    /* GAMMA CONTROL */
    LCD_WriteReg(0x0030,0x0707);
    LCD_WriteReg(0x0031,0x0007); 
    LCD_WriteReg(0x0032,0x0603); 
    LCD_WriteReg(0x0033,0x0700); 
    LCD_WriteReg(0x0034,0x0202); 
    LCD_WriteReg(0x0035,0x0002); 
    LCD_WriteReg(0x0036,0x1F0F);
    LCD_WriteReg(0x0037,0x0707); 
    LCD_WriteReg(0x0038,0x0000); 
    LCD_WriteReg(0x0039,0x0000); 
    LCD_WriteReg(0x003A,0x0707); 
    LCD_WriteReg(0x003B,0x0000); 
    LCD_WriteReg(0x003C,0x0007); 
    LCD_WriteReg(0x003D,0x0000); 
    LCD_Delay(5);                   /* delay 50 ms */		
    LCD_WriteReg(0x0007,0x0001);
    LCD_WriteReg(0x0017,0x0001);    /* Power supply startup enable */
    LCD_Delay(5);                   /* delay 50 ms */		
    /* power control */
    LCD_WriteReg(0x0010,0x17A0); 
    LCD_WriteReg(0x0011,0x0217);    /* reference voltage VC[2:0]   Vciout = 1.00*Vcivl */
    LCD_WriteReg(0x0012,0x011E);    /* Vreg1out = Vcilvl*1.80   is it the same as Vgama1out ?	*/
    LCD_WriteReg(0x0013,0x0F00);    /* VDV[4:0]-->VCOM Amplitude VcomL = VcomH - Vcom Ampl */
    LCD_WriteReg(0x002A,0x0000);  
    LCD_WriteReg(0x0029,0x000A);    /* Vcomh = VCM1[4:0]*Vreg1out    gate source voltage?? */
    LCD_WriteReg(0x0012,0x013E);    /* power supply on */
    /* Coordinates Control */
    LCD_WriteReg(0x0050,0x0000);
    LCD_WriteReg(0x0051,0x00EF); 
    LCD_WriteReg(0x0052,0x0000); 
    LCD_WriteReg(0x0053,0x013F); 
    /* Pannel Image Control */
    LCD_WriteReg(0x0060,0x2700); 
    LCD_WriteReg(0x0061,0x0001); 
    LCD_WriteReg(0x006A,0x0000); 
    LCD_WriteReg(0x0080,0x0000); 
    /* Partial Image Control */
    LCD_WriteReg(0x0081,0x0000); 
    LCD_WriteReg(0x0082,0x0000); 
    LCD_WriteReg(0x0083,0x0000); 
    LCD_WriteReg(0x0084,0x0000); 
    LCD_WriteReg(0x0085,0x0000); 
    /* Panel Interface Control */
    LCD_WriteReg(0x0090,0x0013);      /* frenqucy */	
    LCD_WriteReg(0x0092,0x0300); 
    LCD_WriteReg(0x0093,0x0005); 
    LCD_WriteReg(0x0095,0x0000); 
    LCD_WriteReg(0x0097,0x0000); 
    LCD_WriteReg(0x0098,0x0000); 
  
    LCD_WriteReg(0x0001,0x0100); 
    LCD_WriteReg(0x0002,0x0700); 
    LCD_WriteReg(0x0003,0x1030); 
    LCD_WriteReg(0x0004,0x0000); 
    LCD_WriteReg(0x000C,0x0000); 
    LCD_WriteReg(0x000F,0x0000); 
    LCD_WriteReg(0x0020,0x0000); 
    LCD_WriteReg(0x0021,0x0000); 
    LCD_WriteReg(0x0007,0x0021); 
    LCD_Delay(20);                   /* delay 200 ms */		
    LCD_WriteReg(0x0007,0x0061); 
    LCD_Delay(20);                   /* delay 200 ms */		
    LCD_WriteReg(0x0007,0x0173); 
    LCD_Delay(20);                   /* delay 200 ms */		
  }							 
  else if(DeviceCode==0x8989)
  {
    LCD_WriteReg(0x0000,0x0001);    LCD_Delay(5);   /* ┤≥┐¬╛º╒± */
    LCD_WriteReg(0x0003,0xA8A4);    LCD_Delay(5);   
    LCD_WriteReg(0x000C,0x0000);    LCD_Delay(5);   
    LCD_WriteReg(0x000D,0x080C);    LCD_Delay(5);   
    LCD_WriteReg(0x000E,0x2B00);    LCD_Delay(5);   
    LCD_WriteReg(0x001E,0x00B0);    LCD_Delay(5);   
    LCD_WriteReg(0x0001,0x2B3F);    LCD_Delay(5);   /* ╟²╢»╩Σ│÷┐╪╓╞320*240 0x2B3F */
    LCD_WriteReg(0x0002,0x0600);    LCD_Delay(5);
    LCD_WriteReg(0x0010,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0011,0x6070);    LCD_Delay(5);   /* ╢¿╥σ╩²╛▌╕±╩╜ 16╬╗╔½ ║ß╞┴ 0x6070 */
    LCD_WriteReg(0x0005,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0006,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0016,0xEF1C);    LCD_Delay(5);
    LCD_WriteReg(0x0017,0x0003);    LCD_Delay(5);
    LCD_WriteReg(0x0007,0x0133);    LCD_Delay(5);         
    LCD_WriteReg(0x000B,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x000F,0x0000);    LCD_Delay(5);   /* ╔¿├Φ┐¬╩╝╡╪╓╖ */
    LCD_WriteReg(0x0041,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0042,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0048,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0049,0x013F);    LCD_Delay(5);
    LCD_WriteReg(0x004A,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x004B,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0044,0xEF00);    LCD_Delay(5);
    LCD_WriteReg(0x0045,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0046,0x013F);    LCD_Delay(5);
    LCD_WriteReg(0x0030,0x0707);    LCD_Delay(5);
    LCD_WriteReg(0x0031,0x0204);    LCD_Delay(5);
    LCD_WriteReg(0x0032,0x0204);    LCD_Delay(5);
    LCD_WriteReg(0x0033,0x0502);    LCD_Delay(5);
    LCD_WriteReg(0x0034,0x0507);    LCD_Delay(5);
    LCD_WriteReg(0x0035,0x0204);    LCD_Delay(5);
    LCD_WriteReg(0x0036,0x0204);    LCD_Delay(5);
    LCD_WriteReg(0x0037,0x0502);    LCD_Delay(5);
    LCD_WriteReg(0x003A,0x0302);    LCD_Delay(5);
    LCD_WriteReg(0x003B,0x0302);    LCD_Delay(5);
    LCD_WriteReg(0x0023,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0024,0x0000);    LCD_Delay(5);
    LCD_WriteReg(0x0025,0x8000);    LCD_Delay(5);
    LCD_WriteReg(0x004f,0);        /* ╨╨╩╫╓╖0 */
    LCD_WriteReg(0x004e,0);        /* ┴╨╩╫╓╖0 */
  }
  LCD_Delay(5);  /* delay 50 ms */		
}

Только у вас он маленький весьма получился.
Это смотря с чем сравнивать. У символьных всё проще =)

В вашем примере настраиваются 6 вариантов дисплеев. У меня — только ili9320.

Плюс, я не использую partial images (соответствующие регистры выставляются в 0x0000 в цикле), не трогаю настройки гамма-коррекцию (10 регистров).
Посмотрел в datasheet более внимательно. У меня STM32F103RB (он medium-density, 64 ноги) нет FSMC. Он доступен только на high-density с количеством выводов 100 (т. е. STM32F103VC, STM32F103VD, STM32F103VE).
Круто, спасибо за пост. Особая ценность поста — пример работы с графическими дисплеями!
Приятно видеть как новогодняя тусовка пополняется всё новыми людми и решениями, Спасибо!
К сожалению, на adafruit нет этого продукта и, соответственно, документации и примеров.

Но, честно говоря, не верится, чтобы atmega32 при своих 16 MHz и без DMA могла тянуть инфу с sd и обновлять экран столь быстро, разве что на пределе возможностей. В общем, жду исходников.
Продукт был не adafruit'овской разработки, документация у lady Ada сохранилась в wiki, а вот все посты, связанные с разработкой этого чудо-устройства канули в лету вместе с сайтом posterous.

PS Было бы здорово, если бы кто-нибудь написал про этот пик инженерного мастерства пост, пока это не кануло в лету окончательно.
Здесь исходники софтовой части github.com/rossumur/microtouch, а здесь github.com/adafruit/microtouch — железной.

Бегло глянул исходники, там реализованы:
— «драйвера» дисплея, тачскирина, sd, fat, usb cdc;
— однозадачная ОС.

Из интересных решений увидел:
— ручное разворачивание цикла для выровненной на 4 байта записи в дисплей;
— использование аппаратных возможностей контроллера дисплея для скролла.

Если есть желание — напишите статью. У меня нет ни железки, ни времени, к сожалению.
Это же космолет 1 (сэнчжоу1), разве нет? К нему дают диск на китайском, я перевел названия каталогов через гугло-транслейт, стало возможно ориентироваться. Все хочу оформить плату под coocox, но руки не доходят. =(
Это клон mini-stm32. Диска в комплекте не было. Архивы со схемой и примерами искал, сравнивал с реальным подключением, и в какой-то момент нашел более-менее соответствующий. Но всё равно, datasheet + тестер необходимы. Надписи на плате плюс чуть-чуть реверса спасают =)
Копий этой платы довольно много. На той, что по ссылке, написано armjishu, на моей — mcujishu. Других отличий не видно.
Я про свою тоже ничего не смог нагуглить, потом пошел на страницу описания на ебее (уже не найти), увидел фотку диска и меня осенило. )
Посмотрите, может это такая же поделка.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.