STM32F4 Yeni LTDC modülü ve CLUT (Color Look-Up Table) hakkında

Başlatan strom, 16 Aralık 2013, 20:22:52

strom

Herkese iyi günler.
Çizgi-Tagem'in yeni getirttiği STM32F429I-Disco kitinden almış bulunmaktayım. Diğer stm denetleyicilerinden farklı olarak bu denetleyicye LCD sürmek için iki modül eklemiş. Bunlar LTDC ve DMA2D. Bunların çalışma mantığını anlamak için yola koyuldum ve bir yerde takıldım. Bu konuda sizden yardım isteyecektim. Öncelikle şunu belirteyim; bu modüller hakkında stm hiç dökümantasyon yapmamış. 0'a yakın bilgi var. Ayrıca STM'nin kendine ait olan;
STM32F4xx standart periphral library'si için hiç açıklama yapmamış. Nette kaynak ulamadım. STM32F2xx standart periphral kütüphanesinin nasıl kullanılacağı ile ilgili "Description of standart library" dökümanı vardı. Çok açık olmasada bayağı işe yarıyordu. Şimdi özellikle yeni eklenen modüllerin hangi fonskyionlara sahip olduğunu bulmak çok sıkıntı.
Gelelim sorunuma. Öğrenme amaçlı L8 (İndexed Color Mode) pixel modunu kullanmaya çalışıyorum. Böylelikle bir renk paleti kullanarak, resimler için hafızada daha az yer ayırmak istiyorum. Böyle birşeyin varlığını ilk defa datasheet'te gördüğüm için önce nette renk paleti (Color Look-Up Table) ile ilgili bazı araştırmalar yaptım. Kabaca ne işe yaradığını anladım ama bunu stm ile nasıl kullanacağımı anlamadım. Benim anladığım renk paleti; 256 elemanlı bir dizi ve dizinin her elemanı bir rengi gösteriyor. Gelgelelim bu diziyi stm'ye nasıl tanıtacağımı bulamadım.
LTDC_LxCLUTWR isimli bir kaydedici var ama ben 256 farklı renk dizisini bu tek satırlık kaydediciye nasıl atayacağım. Kaydedicinin açıklaması şu şekilde;

Bits 31:24CLUTADD[7:0]: CLUT Address
These bits configure the CLUT address (color position within the CLUT) of each RGB 
value
Bits 23:16RED[7:0]: Red value
These bits configure the red value
Bits 15:8GREEN[7:0]: Green value
These bits configure the green value
Bits 7:0BLUE[7:0]: Blue value
These bits configure the blue value


ama görüldüğü gibi burda sadece 1 renk için indis atayabiliyioruz. Yada olay sandığımdan çok daha farklı işliyor. Şimdi de size reference manual'deki CLUT ile ilgili kısımı aynen kopyalıyorum;

Color Look-Up Table (CLUT)
The CLUT can be enabled at run-time for every layer through the LTDC_LxCRregister and 
it is only useful in case of indexed color when using the L8, AL44 and AL88 input pixel 
format. 
First, the CLUT has to be loaded with the R, G and B values that will replace the original R, 
G, B values of that pixel (indexed color). Each color (RGB value) has its own address which 
is the position within the CLUT.
The R, G and B values and their own respective address are programmed through the 
LTDC_LxCLUTWRregister.
• In case of L8 and AL88 input pixel format, the CLUT has to be loaded by 256 colors. The 
address of each color is configured in the CLUTADD bits in the LTDC_LxCLUTWR
register.
• In case of AL44 input pixel format, the CLUT has to be only loaded by 16 colors. The 
address of each color must be filled by replicating the 4-bit L channel to 8-bit as follows:
– L0 (indexed color 0), at address 0x00
– L1, at address 0x11
– L2, at address 0x22
– .....
– L15, at address 0xFF


Ben bu açıklamadan hiçbirşey anlamadım. Bazı denemeler yaptım ama başaramadım. Ayrıca Keilde LTDC_Layer1->CLUTWR şeklinde bir tanımlama kullanıp, debug ile bu tanımlamanın önüne geldiğimde, CLUTWR için offset '0' gösteriyor ve ayrıca mesela; LTDC_Layer1->CLUTWR = 10 şeklinde bir atama yapıp, debug ile kaydedicinin içeriğini gözlemlediğimde hiçbir değişiklik olmadığını gördüm (diğer kaydedicilerin değerleri değişebiliyor). Ayrıca clut hakkında DMA2D modülü açıklamalarında şu şekilde bir açıklama var;

DMA2D foreground and background CLUT interface
The CLUT interface manages the CLUT memory access and the automatic loading of the 
CLUT.
Three kinds of accesses are possible:
• CLUT read by the PFC during pixel format conversion operation
• CLUT accessed through the AHB slave port when the CPU is reading or writing data 
into the CLUT
• CLUT written through the AHB master port when an automatic loading of the CLUT is 
performed
The CLUT memory loading can be done in two different ways:
• Automatic loading
The following sequence should be followed to load the CLUT: 
a)  Program the CLUT address into the DMA2D_FGCMAR register (foreground 
CLUT) or DMA2D_BGCMAR register (background CLUT)
b)  Program the CLUT size in the CS[7:0] field of the DMA2D_FGPFCCR register 
(foreground CLUT) or DMA2D_BGPFCCR register (background CLUT). 
c)  Set the START bit of the DMA2D_FGPFCCR register (foreground CLUT) or 
DMA2D_BGPFCCR register (background CLUT) to start the transfer. During this 
automatic loading process, the CLUT is not accessible by the CPU. If a conflict 
occurs, a CLUT access error interrupt is raised assuming CAEIE is set to '1' in 
DMA2D_CR. 
• Manual loading
The application has to program the CLUT manually through the DMA2D AHB slave 
port to which the local CLUT memory is mapped.The foreground CLUT is located at 
address offset 0x0400 and the background CLUT at address offset 0x0800.
The CLUT format can be 24 or 32 bits. It is configured through the CCM bit of the 
DMA2D_FGPFCCR register (foreground CLUT) or DMA2D_BGPFCCR register 
(background CLUT) as shown in Table 56: Supported CLUT color mode.


Bunu gördükten sonra iyici allak bullak oldum. Çünkü burdan anladığıma göre clut tablosunu oluşturan DMA2D modülü. Ama o zaman neden LTDC_LxCLUTWR diye bir değişken var?  Ayrıca burdaki prosedürü uygulamama rağmen herhangi bir sonuç alamadım.
Bu konuda bir fikri olan varsa duymayı çok isterim.

Herkese iyi forumlar

olemiss

Herhalde şuradaki dokümanı görmüşsünüzdür: http://www.compel.ru/wordpress/wp-content/uploads/2013/11/1_LTDC_ChromeART.pdf

Bir de sorum olacak: programlama için hangi yazılımları ve/veya toolchain'leri kullanıyorsunuz?  Teşekkürler.
Yazılım Mühendisi, Çevirmen.