Initialize Tizen 2.3
[adaptation/xorg/driver/xserver-xorg-video-emulfb.git] / src / fb / fbdev_fb.c
1 /**************************************************************************
2
3 xserver-xorg-video-emulfb
4
5 Copyright 2010 - 2011 Samsung Electronics co., Ltd. All Rights Reserved.
6
7 Contact: SooChan Lim <sc1.lim@samsung.com>
8
9 Permission is hereby granted, free of charge, to any person obtaining a
10 copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sub license, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
16
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial portions
19 of the Software.
20
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
29 **************************************************************************/
30
31 #include "fbdev.h"
32 #include "fbdev_util.h"
33 #include "fbdev_fb.h"
34
35 struct s3cfb_user_window
36 {
37         int x;
38         int y;
39 };
40
41 #define S3CFB_WIN_ON                _IOW('F', 305, uint)
42 #define S3CFB_WIN_OFF               _IOW('F', 306, uint)
43 #define S3CFB_WIN_POSITION          _IOW('F', 203, struct s3cfb_user_window)
44 #define S3CFB_WIN_SET_PIXEL_ALPHA   _IOW('F', 211, struct fb_var_screeninfo)
45
46 Bool
47 fbdevFbGetVarScreenInfo (int fd, struct fb_var_screeninfo *fbVarInfo)
48 {
49         int ret;
50
51         return_val_if_fail (fd >= 0, FALSE);
52         return_val_if_fail (fbVarInfo != NULL, FALSE);
53
54         ret = ioctl (fd, FBIOGET_VSCREENINFO, (void*)fbVarInfo);
55
56         if (ret)
57         {
58                 xf86DrvMsg (0, X_ERROR, "FBIOGET_VSCREENINFO failed.\n");
59                 return FALSE;
60         }
61
62         return TRUE;
63 }
64
65 Bool
66 fbdevFbSetVarScreenInfo (int fd, struct fb_var_screeninfo *fbVarInfo)
67 {
68         int ret;
69
70         return_val_if_fail (fd >= 0, FALSE);
71         return_val_if_fail (fbVarInfo != NULL, FALSE);
72
73         ret = ioctl (fd, FBIOPUT_VSCREENINFO, (void*)fbVarInfo);
74
75         if (ret)
76         {
77                 xf86DrvMsg (0, X_ERROR, "FBIOPUT_VSCREENINFO failed.\n");
78                 return FALSE;
79         }
80
81         return TRUE;
82 }
83
84 Bool
85 fbdevFbGetFixScreenInfo (int fd, struct fb_fix_screeninfo *fbFixInfo)
86 {
87         int ret;
88
89         return_val_if_fail (fd >= 0, FALSE);
90         return_val_if_fail (fbFixInfo != NULL, FALSE);
91
92         ret = ioctl (fd, FBIOGET_FSCREENINFO, (void*)fbFixInfo);
93
94         if (ret)
95         {
96                 xf86DrvMsg (0, X_ERROR, "FBIOGET_FSCREENINFO failed.\n");
97                 return FALSE;
98         }
99
100         return TRUE;
101 }
102
103 Bool
104 fbdevFbSetWinPosition (int fd, int x, int y)
105 {
106         struct s3cfb_user_window pos;
107         int ret;
108
109         return_val_if_fail (fd >= 0, FALSE);
110
111         pos.x = x;
112         pos.y = y;
113
114         ret = ioctl (fd, S3CFB_WIN_POSITION, &pos);
115         if (ret < 0)
116         {
117                 xf86DrvMsg (0, X_ERROR, "S3CFB_WIN_POSITION failed. pos(%d,%d)\n", x, y);
118                 return FALSE;
119         }
120
121         return TRUE;
122 }
123
124 Bool
125 fbdevFbScreenAlphaInit (int fd)
126 {
127         struct fb_var_screeninfo var;
128         int ret;
129
130         ret = ioctl (fd, FBIOGET_VSCREENINFO, &var);
131         if (ret < 0)
132         {
133                 xf86DrvMsg (0, X_ERROR, "failed to get fb_var\n");
134                 return FALSE;
135         }
136
137         if (var.bits_per_pixel != 32)
138         {
139                 xf86DrvMsg (0, X_ERROR, "per pixel overlay alpha is supported with 32 bpp mode\n");
140                 return FALSE;
141         }
142         var.transp.length = 8;
143         var.activate = FB_ACTIVATE_FORCE;
144         ret = ioctl (fd, FBIOPUT_VSCREENINFO, &var);
145         if (ret < 0)
146         {
147                 xf86DrvMsg (0, X_ERROR, "failed to set fb_var\n");
148                 return FALSE;
149         }
150
151         return TRUE;
152 }
153
154 Bool
155 fbdevFbScreenAlphaDeinit (int fd)
156 {
157         struct fb_var_screeninfo var;
158         int ret;
159
160         ret = ioctl (fd, FBIOGET_VSCREENINFO, &var);
161         if (ret < 0)
162         {
163                 xf86DrvMsg (0, X_ERROR, "failed to get fb_var\n");
164                 return FALSE;
165         }
166
167         var.transp.length = 0;
168         ret = ioctl (fd, FBIOPUT_VSCREENINFO, &var);
169         if (ret < 0)
170         {
171                 xf86DrvMsg (0, X_ERROR, "failed to set fb_var\n");
172                 return FALSE;
173         }
174
175         return TRUE;
176 }
177
178 #include <sys/utsname.h>
179 void
180 fbdevFbResetLCDModule()
181 {
182         char rmmod[255];
183         char insmod[255];
184         struct utsname name;
185
186         if (uname (&name))
187         {
188                 ErrorF ("Fail get umane\n");
189         }
190         sprintf (rmmod, "/sbin/rmmod s3c_lcd");
191         sprintf (insmod, "/sbin/insmod /opt/driver/s3c_lcd.ko");
192
193         if (system (rmmod))
194                 ErrorF ("%s failed.\n", rmmod);
195         if (system (insmod))
196                 ErrorF ("%s failed.\n", insmod);
197 }
198
199
200 /* activate fb */
201 Bool
202 fbdevFbActivate (int fd)
203 {
204         struct fb_var_screeninfo var;
205         int ret;
206
207         ret = ioctl (fd, FBIOGET_VSCREENINFO, &var);
208         if (ret < 0)
209         {
210                 ErrorF ("failed to get fb_var\n");
211                 return FALSE;
212         }
213
214         var.activate = FB_ACTIVATE_FORCE;
215
216         ret = ioctl (fd, FBIOPUT_VSCREENINFO, &var);
217         if (ret < 0)
218         {
219                 ErrorF ("failed to set fb_var.activate\n");
220                 return FALSE;
221         }
222
223         ret = ioctl (fd, FBIOBLANK, FB_BLANK_UNBLANK);
224         if (ret < 0)
225         {
226                 ErrorF ("failed to set FBIOBLANK : FB_BLANK_UNBLANK\n");
227                 return FALSE;
228         }
229
230         return TRUE;
231 }
232
233 /* deactivate fb3 */
234 Bool
235 fbdevFbDeActivate (int fd)
236 {
237         int ret;
238
239         ret = ioctl (fd, FBIOBLANK, FB_BLANK_NORMAL);
240         if (ret < 0)
241         {
242                 ErrorF ("failed to set FBIOBLANK : FB_BLANK_NORMAL\n");
243                 return FALSE;
244         }
245
246         return TRUE;
247 }
248
249 Bool
250 fbdevFbSetBase (int fd)
251 {
252         struct fb_var_screeninfo var;
253         int ret;
254
255         ret = ioctl (fd, FBIOGET_VSCREENINFO, &var);
256         if (ret < 0)
257         {
258                 xf86DrvMsg (0, X_ERROR, "failed to get fb_var\n");
259                 return FALSE;
260         }
261
262         var.yoffset = 0;
263         ret = ioctl (fd, FBIOPAN_DISPLAY,&var);
264         if (ret < 0)
265         {
266                 xf86DrvMsg (0, X_ERROR, "failed to set fb_var\n");
267                 return FALSE;
268         }
269         return TRUE;
270 }
271
272
273 void
274 fbdevFbHWPanDisplay (int fd, int x, int y)
275 {
276         struct fb_var_screeninfo var;
277         int ret;
278
279         ret = ioctl (fd, FBIOGET_VSCREENINFO, &var);
280         if (ret < 0)
281         {
282                 xf86DrvMsg (0, X_WARNING, "!!WARNING::%s::fail to get vscreen_info\n",
283                             __func__);
284                 return;
285         }
286
287         var.xoffset = x;
288         var.yoffset = y;
289         ret = ioctl (fd, FBIOPAN_DISPLAY, &var);
290         if (ret < 0)
291         {
292                 xf86DrvMsg (0, X_WARNING, "!!WARNING::%s::fail to pandisplay(xoff,%d)(yoff,%d)\n",
293                             __func__,
294                             var.xoffset,
295                             var.yoffset);
296                 return;
297         }
298 }