Logo Central

Processeur Graphique

Graphical Processing Unit (GPU) FT800Q de FTDI : j'ai utilisé ce processeur graphique dans un montage afin de simplifier la programmation. En effet, ce chip possède des fonctions de widgets qui facilitent grandement la programmation.

Principe: Le processeur hôte communique via le bus SPI,

Graphical processing unit

image principale

Il y a deux façons de créer un écran à afficher

image principale

Commande de traitement FIFO


Lorsque REG_CMD_READ = REG_CMD_WRITE, le co-processeur a exécuté toutes les commandes de la commande FIFO.
 		
 	do {
	HAL_SPI_CSLow();
	HAL_SPI_SendAddressRD(REG_CMD_WRITE);   //
	cmdBufferWr = FT800_SPI_Read32();       //
	HAL_SPI_CSHigh();
	
HAL_SPI_CSLow(); HAL_SPI_SendAddressRD(REG_CMD_READ); // cmdBufferRd = FT800_SPI_Read32(); // HAL_SPI_CSHigh(); } while(cmdBufferWr != cmdBufferRd);

Étape 2

Le FT800 utilise un tampon circulaire/FIFO pour contenir sa liste de commandes. Lorsqu'une nouvelle liste doit être créée, le MCU écrira les commandes à partir du prochain emplacement disponible (c'est-à-dire la valeur actuelle de REG_CMD_WRITE). Le code ci-dessus attend que toutes les commandes soient exécutées, la valeur de REG_CMD_WRITE est donc copiée dans une variable en tant qu'index de départ.

CMD_Offset = cmdBufferWr; // Obtenir la valeur actuelle du pointeur CMD_WRITE

Étape 3

La première commande de la liste de commandes peut maintenant être écrite dans la pile FIFO (RAM_CMD), et la fonction SendAddressWR est utilisée pour envoyer la commande à l'adresse contenue dans cmdBufferWrite.

Dans ce cas, la commande est DL_START (CMD_DLSTART). Les commandes sont toujours des multiples de 4 octets pour le FT800. La ligne Chip_Select est ensuite désactivée, marquant la fin de cette commande.

Cette opération a écrit quatre octets dans le FIFO. Une liste de commandes sera généralement composée de nombreuses commandes et le MCU doit donc maintenant mettre à jour sa propre valeur de décalage dans la variable cmdBufferWr afin de connaître la position de la commande suivante.

La fonction FT800_IncCMDOffset

Dans la plupart des cas, cette fonction ajoute simplement la longueur de la dernière commande au décalage précédent, mais gère également le cas où l'index atteint 4095 et doit être remis à 0 en raison de la nature circulaire du FIFO.

 		
 	uint32_t ft800q::inc_cmd_Offset(uint32_t currentOffset, uint8_t commandSize)
	{
    	uint16_t newOffset;				// used to hold new offset
    	newOffset = currentOffset + commandSize;	// Calculate new offset
    	if(newOffset > 4095)				// If new offset past boundary...
    		{
        	newOffset = (newOffset - 4096);		// ... roll over pointer
    		}
    	return newOffset;				// Return new offset
	
		
 	
La méthode ci-dessus est proposée par le document "Programmers guide FT800" de FTDI, mais personnellement je préfère une méthode différente:

 	/*** CMD Functions ***************************************/
	uint8_t ft800q::cmd_execute(uint32_t data)
	{
		uint32_t cmdBufferRd = 0;
		uint32_t cmdBufferWr = 0;
    	cmdBufferRd = HOST_MEM_RD32(REG_CMD_READ);
    	cmdBufferWr = HOST_MEM_RD32(REG_CMD_WRITE);

    	uint32_t cmdBufferDiff = cmdBufferWr - cmdBufferRd;

    	if( (4096 - cmdBufferDiff) > 4)
    	{
        	HOST_MEM_WR32(RAM_CMD + cmdBufferWr, data);
        	HOST_MEM_WR32(REG_CMD_WRITE, cmdBufferWr + 4);
        	return 1;
    	}
    	return 0;
	}

	uint8_t ft800q::cmd(uint32_t data)
	{
		uint8_t tryCount = 255;
		for(tryCount = 255; tryCount > 0; --tryCount)
		{
			if(cmd_execute(data)) { return 1; }
		}
	return 0;
	}
	
	

La commande cmd(CMD_DLSTART) : la fonction cmd va appeler la fonction cmd_execute. Tant que celle-ci ne retourne pas la valeur "1", elle essaiera jusqu'à 255 fois. La fonction cmd_execute va retourner la valeur "0" tant que les deux registres ne sont pas égaux. Lorsque c'est le cas, cela signifie que l'on peut écrire une nouvelle commande dans la RAM_CMD. Dès lors, le registre REG_CMD_WRITE sera augmenté de 4 afin de pointer sur la prochaine adresse de la FIFO.

Chaque appel à la fonction cmd déclenchera la procédure HOST_MEM_WR32 pour placer la commande dans la FIFO et adapter le décalage (l'adresse) du registre REG_MEM_CMD.

 	
 	/* ------------------------------------------------------------------------------------------ */
	/* Demo Screen */
	void ft800q::lcd_start_screen(uint8_t button)
	{
		cmd(CMD_DLSTART);
		cmd(CLEAR_COLOR_RGB(0,0,0));
		cmd(CLEAR(1,1,1));
		cmd_gradient(0,0,0xA1E1FF, 0,250,0x000080);
		cmd_text(10,220, 20,0, "Designed by: Herve Fankhauser");
		cmd_text(300,200, 20,OPT_RIGHTX, "zfphfr/myqnapcould.com/hfe");
		cmd(COLOR_RGB(0xDE,0x00,0x08));
		cmd_text(140,40, 31,OPT_CENTERX, "FT800 Demo");
		cmd(COLOR_RGB(255,255,255));
		cmd(TAG(1));

		if(!button)
		{
			cmd_fgcolor(0x228B22);
			cmd_button(50,150, 220,48, 28,0, "Tap to Continue");
		}
		else
		{
			cmd_fgcolor(0x0A520A);
			cmd_button(50,150, 220,48, 28,OPT_FLAT, "Tap to Continue");
		}
		
		cmd(DISPLAY());
		cmd(CMD_SWAP);
	}
	
 	


image resultat