u-boot-2010.03在LT2440上的移植详解 (十)

2019-07-13 02:17发布

u-boot-2010.03在LT2440上的移植详解 (十) 郑重声明,这系列文章改写自博客园 黄刚先生的《嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解》 转载时请注明出处 文章出处:http://www.lt-net.cn 编译系统 Ubuntu10.04 交叉编译器 arm-linux-gcc 4.3.3 硬件设备 LT2440开发板   测试软件 u-boot-2010.03 依赖库 无 uboot下载地址:http://ftp.denx.de/pub/u-boot/u-boot-2010.03.tar.bz2

本次移植在u-boot-2010.03原有功能的基础上增加如下特性:

  1.支持2KB  page Nand Flash读写
  2.支持Nand/Nor Flash启动自动识别
  3.支持DM9000AEP 10M/100M自适应网卡
  4.支持yaffs文件系统烧写
  5.支持USB下载功能
  6.支持一键式菜单
  7.支持启动Logo
  8.支持ubifs(待续)

上接:u-boot-2010.03在LT2440上的移植详解 (九)

支持启动logo我们将logo编译进u-boot,需要增加显示驱动,还有显示的logo数据,下面先增加显示驱动
# gedit  drivers/video/s3c2440_fb.c
  1. #include
  2. #include
  3. #include "lutong_logo.c"
  4. #define MVAL   (13)
  5. #define MVAL_USED   (0)  //0=each frame   1=rate by MVAL
  6. #define INVVDEN    (1)  //0=normal       1=inverted
  7. #define BSWP   (0)   //Byte swap control
  8. #define HWSWP   (1)  //Half word swap control
  9. #define SCR_XSIZE_TFT  (LCD_XSIZE_TFT)
  10. #define SCR_YSIZE_TFT   (LCD_YSIZE_TFT)
  11. #define HOZVAL_TFT     ( LCD_XSIZE_TFT - 1 )
  12. #define LINEVAL_TFT   ( LCD_YSIZE_TFT - 1 )

  13. #define U32 unsigned int
  14. #define M5D(n)    ( ( n ) & 0x1fffff )
  15. volatile unsigned short tf2440_LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT] = { 0 } ;
  16. volatile char vbpd = 1, vfpd = 1, vspw = 1, hbpd = 1, hfpd = 1, hspw = 1, clkval_tft = 1 ;

  17. /**************************************************************
  18. Clear TFT LCD With C
  19. **************************************************************/
  20. void tf2440_lcd_ClearScr( U32 c)
  21. {
  22. unsigned int x,y ;
  23. for( y = 0 ; y < LCD_YSIZE_TFT ; y++ )
  24. {
  25. for( x = 0 ; x < (SCR_XSIZE_TFT) ; x++ )
  26. {
  27. tf2440_LCD_BUFFER[y][x] = c;
  28. }
  29. }
  30. }

  31. /**************************************************************
  32. TFT LCD指定大小的矩形填充特定颜 {MOD}单元或清屏
  33. **************************************************************/
  34. void tf2440_lcd_ClearScr_Rectangle( int x0,int y0,int width,int height, U32 c)
  35. {
  36. unsigned int x,y ;

  37. for( y = y0 ; y < (y0 + height) ; y++ )
  38. {
  39. for( x = x0 ; x < (width + x0) ; x++ )
  40. {
  41. tf2440_LCD_BUFFER[y][x] = c;
  42. }
  43. }
  44. }

  45. /**************************************************************
  46. 在LCD屏幕上指定坐标点画一个指定大小的图片
  47. **************************************************************/
  48. void tf2440_paint_Bmp(int x0,int y0,int width,int height, unsigned char bmp[])
  49. {
  50. int x, y ;
  51. U32 c ;
  52. int p = 0 ;
  53. for( y = y0 ; y < (height + y0) ; y++ )
  54. {
  55. for( x = x0 ; x < (width + x0) ; x++ )
  56. {
  57. c = bmp[p+1] | (bmp[p] << 8) ;
  58. if ( ( x <= (SCR_XSIZE_TFT) ) && ( y <= LCD_YSIZE_TFT ) )
  59. tf2440_LCD_BUFFER[y][x] = c;
  60. p = p + 2 ;
  61. }
  62. }
  63. }

  64. /**************************************************************
  65. 在坐标(X,Y)画点
  66. **************************************************************/
  67. void putPixel(U32 x, U32 y, U32 c)
  68. {
  69. if( (x < LCD_XSIZE_TFT) && (y < LCD_YSIZE_TFT))
  70. tf2440_LCD_BUFFER[y][x] = c;
  71. }
  72. U32 currWidth = 0;
  73. void drawProcessBar(U32 total, U32 current )
  74. {
  75. U32 const bar_height = 8;
  76. U32 bar_base = LCD_YSIZE_TFT - bar_height;
  77. int i = (int) LCD_XSIZE_TFT / 8;
  78. U32 j;
  79. int pbcolor ;
  80. if(total != -1)
  81. {
  82. j = 0;
  83. int bar_width = (int) LCD_XSIZE_TFT * ((current * 1.0) / total);
  84. if (bar_width <= i)
  85. pbcolor = 0x7FF;
  86. //sky blue
  87. else if((bar_width > i) && (bar_width <= i * 2))
  88. pbcolor = 0x1F;
  89. //blue
  90. else if((bar_width > i * 2) && (bar_width <= i * 3))
  91. pbcolor = 0x0;
  92. //black
  93. else if((bar_width > i * 3) && (bar_width <= i * 4))
  94. pbcolor = 0xF81F;
  95. //purple
  96. else if((bar_width > i * 4) && (bar_width <= i * 5))
  97. pbcolor = 0xFFFF;
  98. //white
  99. else if((bar_width > i * 5) && (bar_width <= i * 6))
  100. pbcolor = 0xF800;
  101. //red
  102. else if((bar_width > i * 6) && (bar_width <= i * 7))
  103. pbcolor = 0xFFE0;
  104. //yellow
  105. else if((bar_width > i * 7) && (bar_width <= i * 8))
  106. pbcolor = 0x7E0;
  107. //green
  108. if(bar_width > currWidth)
  109. {
  110. for ( ; j < bar_height; j++)
  111. {
  112. putPixel(bar_width, j + bar_base, pbcolor);
  113. }
  114. currWidth = bar_width;
  115. }
  116. }
  117. }

  118. /**************************************************************
  119. LCD PWREN
  120. **************************************************************/
  121. void tf2440_lcd_PowerEnable(int invpwren , int pwren)
  122. {
  123. struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
  124. struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();

  125. gpio -> GPGUP = gpio -> GPGUP & ( ~( 1 << 4) ) | ( 1 << 4) ;
  126. gpio -> GPGCON = gpio -> GPGCON & ( ~( 3 << 8) ) | ( 3 << 8) ;
  127. gpio -> GPGDAT = gpio -> GPGDAT | (1 << 4 ) ;
  128. lcd -> LCDCON5 = lcd -> LCDCON5 & ( ~( 1 << 3 ) ) | ( pwren << 3 ) ;
  129. lcd -> LCDCON5 = lcd -> LCDCON5 & ( ~( 1 << 5 ) ) | ( invpwren << 5 ) ;
  130. }

  131. /**************************************************************
  132. LCD ON//OFF
  133. **************************************************************/
  134. void tf2440_lcd_EnvidOnOff(int onoff)
  135. {
  136. struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();
  137. if( onoff == 1 )
  138. lcd -> LCDCON1 |= 1 ;
  139. elselcd -> LCDCON1 = lcd -> LCDCON1 & 0x3fffe ;
  140. }

  141. /**************************************************************
  142. LCD Init
  143. **************************************************************/
  144. void tf2440_lcd_init(void)
  145. {
  146. int x, y ;
  147. U32 c ;
  148. int p = 0 ;
  149. struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
  150. struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();
  151. char *s_lcd;
  152. lcd -> LCDSADDR1 = ( ( ( U32 ) tf2440_LCD_BUFFER >> 22 ) << 21 ) | M5D ( ( U32 ) tf2440_LCD_BUFFER >> 1 ) ;
  153. lcd -> LCDSADDR2 = M5D( ( ( U32) tf2440_LCD_BUFFER + ( SCR_XSIZE_TFT * LCD_YSIZE_TFT * 2 ) ) >> 1 ) ;
  154. lcd -> LCDSADDR3 = ( ( ( SCR_XSIZE_TFT - LCD_XSIZE_TFT ) / 1 ) << 11 ) | ( LCD_XSIZE_TFT /1 ) ;
  155. vbpd =CONFIG_TF2440_LCD_VBPD;
  156. vfpd = CONFIG_TF2440_LCD_VFPD;
  157. vspw = CONFIG_TF2440_LCD_VSPW;
  158. hbpd =CONFIG_TF2440_LCD_HBPD ;
  159. hfpd =CONFIG_TF2440_LCD_HFPD;
  160. hspw = CONFIG_TF2440_LCD_HSPW;
  161. clkval_tft =CONFIG_TF2440_LCD_CLKVAL ;
  162. tf2440_lcd_ClearScr( 0x0 ) ;
  163. gpio -> GPCUP  = 0xffffffff ;
  164. gpio -> GPCCON = 0xaaaaaaaa ;
  165. //Initialize VD[0:7]
  166. gpio -> GPDUP  = 0xffffffff ;
  167. gpio -> GPDCON = 0xaaaaaaaa ;
  168. //Initialize VD[15:8]
  169. lcd -> LCDCON1 = ( clkval_tft << 8 ) | ( MVAL_USED << 7 ) | (3 << 5 ) | ( 12 << 1 ) | 0 ;
  170. lcd -> LCDCON2 = ( vbpd << 24 ) | ( LINEVAL_TFT << 14 ) | ( vfpd << 6 ) | ( vspw ) ;
  171. lcd -> LCDCON3 = ( hbpd << 19 ) | ( HOZVAL_TFT << 8 ) | ( hfpd ) ;
  172. lcd -> LCDCON4 = ( MVAL << 8 ) | ( hspw ) ;
  173. lcd -> LCDCON5 = ( 1 << 11) | ( 0 << 10 ) | ( 1 << 9 ) | ( 1 << 8 ) | ( 0 << 7 ) | ( 0 << 6 ) | ( 1 << 3 ) | ( BSWP << 1 ) | ( HWSWP ) ;
  174. lcd -> LPCSEL &= ( ~7 ) ;
  175. // Disable LPC3480
  176. lcd -> TPAL = 0x0 ;
  177. // Disable Temp Palette
  178. tf2440_lcd_PowerEnable( 0, 1 ) ;
  179. }

  180. void tf2440_logo(void)
  181. {
  182. struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
  183. struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();


  184. tf2440_lcd_ClearScr(0x0);
  185. tf2440_paint_Bmp(0, 0, 320, 240, lutong_logo) ;
  186. tf2440_lcd_EnvidOnOff ( 1 ) ;
  187. }
复制代码

# gedit  drivers/video/Makefile //在42行添加 COBJS-y += s3c2410_fb.o
# gedit common/main.c
//
在启动的时候调用LCD初始化函数然后调用画图函数绘制logo,作如下修改
//在308行添加:
#if defined(CONFIG_TF2440_LOGO)
tf2440_lcd_init();
tf2440_logo();
#endif


# gedit  include/configs/lt2440.h //上面有LOGO的宏定义没添加,需要在lt2440.h添加如下的宏定义 /*-----------------------------------------------------------------------
* LCD CONFIG
*/
#define CONFIG_TF2440_LOGO    1
#ifdef   CONFIG_TF2440_LOGO
#define  CONFIG_TFT320x240    1
#define CONFIG_TFT480x272     2
#define TFT_LCD    CONFIG_TFT320x240
#if  (TFT_LCD==CONFIG_TFT320x240)
#define  CONFIG_TF2440_LCD_VBPD   15
#define  CONFIG_TF2440_LCD_VFPD    4
#define  CONFIG_TF2440_LCD_VSPW   3
#define  CONFIG_TF2440_LCD_HBPD  38
#define  CONFIG_TF2440_LCD_HFPD   20
#define  CONFIG_TF2440_LCD_HSPW  30
#define  CONFIG_TF2440_LCD_CLKVAL  7
#define LCD_XSIZE_TFT   320
#define LCD_YSIZE_TFT  240
#elif  (TFT_LCD==CONFIG_TFT480x272)
#define  CONFIG_TF2440_LCD_VBPD 2
#define  CONFIG_TF2440_LCD_VFPD  2
#define  CONFIG_TF2440_LCD_VSPW  10
#define  CONFIG_TF2440_LCD_HBPD    2
#define  CONFIG_TF2440_LCD_HFPD    2
#define   CONFIG_TF2440_LCD_HSPW  15
#define  CONFIG_TF2440_LCD_CLKVAL   5
#define LCD_XSIZE_TFT    480
#define LCD_YSIZE_TFT    272
#endif
#endif


接下来就是制作logo图像数据了图片转换软件可以在这里下载
http://blogimg.chinaunix.net/blog/upfile2/101209150029.rar
我们的资料光盘 “光盘资料/windows下工具软件及驱动/BMP图片转换软件” 目录下面有图片转换软件,使用这个软件转换bmp图片文件到数组C文件。转换过程如下:

1.准备一张bmp图片,图片的分辨率小于等于480*272 (4.3寸屏)或者320*240(3.5寸屏)查看图片属性,480*272图片生成的数据量比较大,我们建议您使用320*240的,驱动也是支持320*240的,使用其他的分辨率请修改驱动。
 



2.打开“位图转换”,点击添加图片



3.点击转换


 
4.将会值当前目录下生成图片c语言数组代码

5.将会得到lutong_logo.c文件,需要做如下修改
只是掉文件开始的一个包含,还要去读“ALIGN4 ”
/*BMP C file converted from BMP file*/

#define WIN32
//  #include "base.h"

const unsigned char lutong_logo[] = {
   /* image header, 20 bytes */
#if 0   //需要注释掉这个文件头
#ifdef        WIN32
  0x18,0x00,0x00,0x00,0x18,0x58,0x02,0x00,
#else
  0x00,0x00,0x00,0x18,0x00,0x02,0x58,0x18,
#endif
#ifdef        WIN32
64,  1,240,  0,  0,  0,128,  2, 16,  0,  1,  0,  0,  0,  0,  0,
#else
  1, 64,  0,240,  0,  0,  2,128,  0, 16,  0,  1,  0,  0,  0,  0,
#endif
#endif
将这个修改后lutong_logo.c文件复制到 driver/video/目录下
然后编译u-boot,然后烧写到NandFlash中,开机即可看到logo了