]>
Commit | Line | Data |
---|---|---|
eeb1b77b WD |
1 | /* |
2 | * (C) Copyright 2004 | |
3 | * Pierre Aubert, Staubli Faverges , <p.aubert@staubli.com> | |
4 | * | |
5 | * See file CREDITS for list of people who contributed to this | |
6 | * project. | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU General Public License as | |
10 | * published by the Free Software Foundation; either version 2 of | |
11 | * the License, or (at your option) any later version. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU General Public License | |
19 | * along with this program; if not, write to the Free Software | |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
21 | * MA 02111-1307 USA | |
22 | */ | |
23 | ||
24 | /************************************************************************ | |
25 | Get Parameters for the video mode: | |
26 | The default video mode can be defined in CFG_DEFAULT_VIDEO_MODE. | |
27 | If undefined, default video mode is set to 0x301 | |
28 | Parameters can be set via the variable "videomode" in the environment. | |
29 | 2 diferent ways are possible: | |
30 | "videomode=301" - 301 is a hexadecimal number describing the VESA | |
31 | mode. Following modes are implemented: | |
32 | ||
33 | Colors 640x480 800x600 1024x768 1152x864 1280x1024 | |
34 | --------+--------------------------------------------- | |
35 | 8 bits | 0x301 0x303 0x305 0x161 0x307 | |
36 | 15 bits | 0x310 0x313 0x316 0x162 0x319 | |
37 | 16 bits | 0x311 0x314 0x317 0x163 0x31A | |
38 | 24 bits | 0x312 0x315 0x318 ? 0x31B | |
39 | --------+--------------------------------------------- | |
40 | "videomode=bootargs" | |
41 | - the parameters are parsed from the bootargs. | |
42 | The format is "NAME:VALUE,NAME:VALUE" etc. | |
43 | Ex.: | |
44 | "bootargs=video=ctfb:x:800,y:600,depth:16,pclk:25000" | |
45 | Parameters not included in the list will be taken from | |
46 | the default mode, which is one of the following: | |
47 | mode:0 640x480x24 | |
48 | mode:1 800x600x16 | |
49 | mode:2 1024x768x8 | |
50 | mode:3 960x720x24 | |
51 | mode:4 1152x864x16 | |
52 | mode:5 1280x1024x8 | |
53 | ||
54 | if "mode" is not provided within the parameter list, | |
55 | mode:0 is assumed. | |
56 | Following parameters are supported: | |
57 | x xres = visible resolution horizontal | |
58 | y yres = visible resolution vertical | |
59 | pclk pixelclocks in pico sec | |
60 | le left_marging time from sync to picture in pixelclocks | |
61 | ri right_marging time from picture to sync in pixelclocks | |
62 | up upper_margin time from sync to picture | |
63 | lo lower_margin | |
64 | hs hsync_len length of horizontal sync | |
65 | vs vsync_len length of vertical sync | |
66 | sync see FB_SYNC_* | |
67 | vmode see FB_VMODE_* | |
68 | depth Color depth in bits per pixel | |
69 | All other parameters in the variable bootargs are ignored. | |
70 | It is also possible to set the parameters direct in the | |
71 | variable "videomode", or in another variable i.e. | |
72 | "myvideo" and setting the variable "videomode=myvideo".. | |
73 | ****************************************************************************/ | |
74 | ||
75 | #include <common.h> | |
76 | #include "videomodes.h" | |
77 | ||
78 | const struct ctfb_vesa_modes vesa_modes[VESA_MODES_COUNT] = { | |
79 | {0x301, RES_MODE_640x480, 8}, | |
80 | {0x310, RES_MODE_640x480, 15}, | |
81 | {0x311, RES_MODE_640x480, 16}, | |
82 | {0x312, RES_MODE_640x480, 24}, | |
83 | {0x303, RES_MODE_800x600, 8}, | |
84 | {0x313, RES_MODE_800x600, 15}, | |
85 | {0x314, RES_MODE_800x600, 16}, | |
86 | {0x315, RES_MODE_800x600, 24}, | |
87 | {0x305, RES_MODE_1024x768, 8}, | |
88 | {0x316, RES_MODE_1024x768, 15}, | |
89 | {0x317, RES_MODE_1024x768, 16}, | |
90 | {0x318, RES_MODE_1024x768, 24}, | |
91 | {0x161, RES_MODE_1152x864, 8}, | |
92 | {0x162, RES_MODE_1152x864, 15}, | |
93 | {0x163, RES_MODE_1152x864, 16}, | |
94 | {0x307, RES_MODE_1280x1024, 8}, | |
95 | {0x319, RES_MODE_1280x1024, 15}, | |
96 | {0x31A, RES_MODE_1280x1024, 16}, | |
97 | {0x31B, RES_MODE_1280x1024, 24}, | |
98 | }; | |
99 | const struct ctfb_res_modes res_mode_init[RES_MODES_COUNT] = { | |
100 | /* x y pixclk le ri up lo hs vs s vmode */ | |
101 | {640, 480, 39721, 40, 24, 32, 11, 96, 2, 0, FB_VMODE_NONINTERLACED}, | |
102 | {800, 600, 27778, 64, 24, 22, 1, 72, 2, 0, FB_VMODE_NONINTERLACED}, | |
103 | {1024, 768, 15384, 168, 8, 29, 3, 144, 4, 0, FB_VMODE_NONINTERLACED}, | |
104 | {960, 720, 13100, 160, 40, 32, 8, 80, 4, 0, FB_VMODE_NONINTERLACED}, | |
105 | {1152, 864, 12004, 200, 64, 32, 16, 80, 4, 0, FB_VMODE_NONINTERLACED}, | |
106 | {1280, 1024, 9090, 200, 48, 26, 1, 184, 3, 0, FB_VMODE_NONINTERLACED}, | |
107 | }; | |
108 | ||
109 | /************************************************************************ | |
110 | * Get Parameters for the video mode: | |
111 | */ | |
112 | /********************************************************************* | |
113 | * returns the length to the next seperator | |
114 | */ | |
115 | static int | |
116 | video_get_param_len (char *start, char sep) | |
117 | { | |
118 | int i = 0; | |
119 | while ((*start != 0) && (*start != sep)) { | |
120 | start++; | |
121 | i++; | |
122 | } | |
123 | return i; | |
124 | } | |
125 | ||
126 | static int | |
127 | video_search_param (char *start, char *param) | |
128 | { | |
129 | int len, totallen, i; | |
130 | char *p = start; | |
131 | len = strlen (param); | |
132 | totallen = len + strlen (start); | |
133 | for (i = 0; i < totallen; i++) { | |
134 | if (strncmp (p++, param, len) == 0) | |
135 | return (i); | |
136 | } | |
137 | return -1; | |
138 | } | |
139 | ||
140 | /*************************************************************** | |
141 | * Get parameter via the environment as it is done for the | |
142 | * linux kernel i.e: | |
143 | * video=ctfb:x:800,xv:1280,y:600,yv:1024,depth:16,mode:0,pclk:25000, | |
144 | * le:56,ri:48,up:26,lo:5,hs:152,vs:2,sync:0,vmode:0,accel:0 | |
145 | * | |
146 | * penv is a pointer to the environment, containing the string, or the name of | |
147 | * another environment variable. It could even be the term "bootargs" | |
148 | */ | |
149 | ||
150 | #define GET_OPTION(name,var) \ | |
151 | if(strncmp(p,name,strlen(name))==0) { \ | |
152 | val_s=p+strlen(name); \ | |
153 | var=simple_strtoul(val_s, NULL, 10); \ | |
154 | } | |
155 | ||
156 | int video_get_params (struct ctfb_res_modes *pPar, char *penv) | |
157 | { | |
158 | char *p, *s, *val_s; | |
159 | int i = 0, t; | |
160 | int bpp; | |
161 | int mode; | |
162 | /* first search for the environment containing the real param string */ | |
163 | s = penv; | |
164 | if ((p = getenv (s)) != NULL) { | |
165 | s = p; | |
166 | } | |
167 | /* in case of the bootargs line, we have to start | |
168 | * after "video=ctfb:" | |
169 | */ | |
170 | i = video_search_param (s, "video=ctfb:"); | |
171 | if (i >= 0) { | |
172 | s += i; | |
173 | s += strlen ("video=ctfb:"); | |
174 | } | |
175 | /* search for mode as a default value */ | |
176 | p = s; | |
177 | t = 0; | |
178 | mode = 0; /* default */ | |
179 | while ((i = video_get_param_len (p, ',')) != 0) { | |
180 | GET_OPTION ("mode:", mode) | |
181 | p += i; | |
182 | if (*p != 0) | |
183 | p++; /* skip ',' */ | |
184 | } | |
185 | if (mode >= RES_MODES_COUNT) | |
186 | mode = 0; | |
187 | *pPar = res_mode_init[mode]; /* copy default values */ | |
188 | bpp = 24 - ((mode % 3) * 8); | |
189 | p = s; /* restart */ | |
190 | while ((i = video_get_param_len (p, ',')) != 0) { | |
191 | GET_OPTION ("x:", pPar->xres) | |
192 | GET_OPTION ("y:", pPar->yres) | |
193 | GET_OPTION ("le:", pPar->left_margin) | |
194 | GET_OPTION ("ri:", pPar->right_margin) | |
195 | GET_OPTION ("up:", pPar->upper_margin) | |
196 | GET_OPTION ("lo:", pPar->lower_margin) | |
197 | GET_OPTION ("hs:", pPar->hsync_len) | |
198 | GET_OPTION ("vs:", pPar->vsync_len) | |
199 | GET_OPTION ("sync:", pPar->sync) | |
200 | GET_OPTION ("vmode:", pPar->vmode) | |
201 | GET_OPTION ("pclk:", pPar->pixclock) | |
202 | GET_OPTION ("depth:", bpp) | |
203 | p += i; | |
204 | if (*p != 0) | |
205 | p++; /* skip ',' */ | |
206 | } | |
207 | return bpp; | |
208 | } |