fbcon: Console Rotation - Add ability to control rotation via sysfs
Subsystems (2)
PATCH 7/8 fbcon: Console Rotation - Add ability to control rotation via sysfs
Add ability to set rotation via sysfs. The attributes are located in /sys/class/graphics/fb[n] and accepts 0 - unrotated; 1 - clockwise; 2 - upside down; 3 - counterclockwise.
The attributes are:
con_rotate (r/w) - set rotation of the active consolecon_rotate_all (w) - set rotation of all consoles
rotate (r/w) - set rotation of the framebuffer, if supported.
Currently, none of the drivers support this.
This is probably temporary, since con_rotate and con_rotate_all are console-specific and has no business being under the fb device. However, until the console layer acquires it's own sysfs class, these attributes will temporarily reside here.
--- drivers/video/console/fbcon.c | 72 ++++++++++++++++++++++++++++++++++++++++++ drivers/video/fbmem.c | 22 ++++++++++++ drivers/video/fbsysfs.c | 67 +++++++++++++++++++++++++++++++++++++++ include/linux/fb.h | 7 ++++ 4 files changed, 168 insertions(+)
drivers/video/console/fbcon.c +72 -0
@@ -193,6 +193,8 @@ static void fbcon_preset_disp(struct fb_ int unit);static void fbcon_redraw_move (struct vc_data *vc,struct display *p,int line,int count,int dy); +static void fbcon_modechanged (struct fb_info *info); +static void fbcon_set_all_vcs (struct fb_info *info);#ifdef CONFIG_MAC /*
@@ -218,6 +220,51 @@ static inline void fbcon_set_rotation(st else ops->rotate = 0; } + +static void fbcon_rotate (struct fb_info *info,u32 rotate) +{ +struct fbcon_ops *ops= info->fbcon_par; +struct fb_info *fb_info; + +if (!ops || ops->currcon ==-1 ) +return ; + + fb_info = registered_fb[con2fb_map[ops->currcon]]; + +if (info == fb_info) { +struct display *p = &fb_display[ops->currcon]; + +if (rotate <4 ) + p->con_rotate = rotate; +else + p->con_rotate =0 ; + +fbcon_modechanged (info); + } +} + +static void fbcon_rotate_all (struct fb_info *info,u32 rotate) +{ +struct fbcon_ops *ops = info->fbcon_par; +struct vc_data *vc; +struct display *p; +int i; + +if (!ops || ops->currcon <0 || rotate >3 ) +return ; + +for (i =0 ; i <MAX_NR_CONSOLES ; i++) { + vc = vc_cons[i].d; +if (!vc || vc->vc_mode !=KD_TEXT || + registered_fb[con2fb_map[i]] != info) +continue ; + + p = &fb_display[vc->vc_num]; + p->con_rotate = rotate; + } + +fbcon_set_all_vcs (info); +}#else static inline void fbcon_set_rotation (struct fb_info *info,struct display *p) {
@@ -225,8 +272,25 @@ static inline void fbcon_set_rotation(st ops->rotate = FB_ROTATE_UR; } + +static void fbcon_rotate (struct fb_info *info,u32 rotate) +{ +return ; +} + +static void fbcon_rotate_all (struct fb_info *info,u32 rotate) +{ +return ; +}#endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */ +static int fbcon_get_rotate (struct fb_info *info) +{ +struct fbcon_ops *ops = info->fbcon_par; + +return (ops) ? ops->rotate :0 ; +} +static inline int fbcon_is_inactive (struct vc_data *vc,struct fb_info *info) {struct fbcon_ops *ops = info->fbcon_par;
@@ -2864,6 +2928,14 @@ static int fbcon_event_notify(struct notcase FB_EVENT_NEW_MODELIST :fbcon_new_modelist (info);break ; +case FB_EVENT_SET_CON_ROTATE : +fbcon_rotate (info, *(int *)event->data); +break ; +case FB_EVENT_GET_CON_ROTATE : + ret =fbcon_get_rotate (info); +break ; +case FB_EVENT_SET_CON_ROTATE_ALL : +fbcon_rotate_all (info, *(int *)event->data); }return ret;
drivers/video/fbmem.c +22 -0
@@ -1319,6 +1319,28 @@ int fb_new_modelist(struct fb_info *inforeturn err; } +/** +* fb_con_duit - user<->fbcon passthrough +* @info: struct fb_info +* @event: notification event to be passed to fbcon +* @data: private data +* +* DESCRIPTION +* This function is an fbcon-user event passing channel +* which bypasses fbdev. This is hopefully temporary +* until a user interface for fbcon is created +*/ +int fb_con_duit (struct fb_info *info,int event,void *data) +{ +struct fb_event evnt; + + evnt.info = info; + evnt.data = data; + +return notifier_call_chain (&fb_notifier_list, event, &evnt); +} +EXPORT_SYMBOL (fb_con_duit); +static char *video_options[FB_MAX ];static int ofonly;
drivers/video/fbsysfs.c +67 -0
79 lines not on this page · raw message
include/linux/fb.h +7 -0
@@ -508,6 +508,12 @@ struct fb_cursor_user {/* The resolution of the passed in fb_info about to change and all vc's should be changed */ #define FB_EVENT_MODE_CHANGE_ALL 0x0A +/* CONSOLE-SPECIFIC: set console rotation */ +#define FB_EVENT_SET_CON_ROTATE 0x0B +/* CONSOLE-SPECIFIC: get console rotation */ +#define FB_EVENT_GET_CON_ROTATE 0x0C +/* CONSOLE-SPECIFIC: rotate all consoles */ +#define FB_EVENT_SET_CON_ROTATE_ALL 0x0Dstruct fb_event {struct fb_info *info;
@@ -836,6 +842,7 @@ extern int fb_get_color_depth(struct fb_ struct fb_fix_screeninfo *fix);extern int fb_get_options (char *name,char **option);extern int fb_new_modelist (struct fb_info *info); +extern int fb_con_duit (struct fb_info *info,int event,void *data);extern struct fb_info *registered_fb[FB_MAX ];extern int num_registered_fb;
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download it for free - -and be entered to win a 42" plasma tv or your very own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php