Search
lxdream.org :: lxdream/src/gtkui/gtk_mmio.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/gtkui/gtk_mmio.c
changeset 1065:bc1cc0c54917
prev563:72ccfd1f432b
prev796:a2dc83592467
author nkeynes
date Fri Mar 02 23:49:10 2012 +1000 (12 years ago)
permissions -rw-r--r--
last change Android WIP:
* Rename gui_jni.c to gui_android.c - now quite android specific.
* Implement generic EGL driver with very minimal Java wrapper
* Run emulation in separate thread, and implement simple queue for
inter-thread communication.
* Add menu/action-bar items for start + reset
view annotate diff log raw
     1 /**
     2  * $Id$
     3  *
     4  * Implements the MMIO register viewing window
     5  *
     6  * Copyright (c) 2005 Nathan Keynes.
     7  *
     8  * This program is free software; you can redistribute it and/or modify
     9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (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  */
    19 #include <stdint.h>
    20 #include <string.h>
    21 #include "gtkui/gtkui.h"
    22 #include "mem.h"
    23 #include "mmio.h"
    26 struct mmio_window_info {
    27     GtkWidget *window;
    28     GtkWidget *notebook;
    29 };
    31 static void printbits( char *out, int nbits, uint32_t value )
    32 {
    33     if( nbits < 32 ) {
    34         int i;
    35         for( i=32; i>nbits; i-- ) {
    36             if( !(i % 8) ) *out++ = ' ';
    37             *out++ = ' ';
    38         }
    39     }
    40     while( nbits > 0 ) {
    41         *out++ = (value&(1<<--nbits) ? '1' : '0');
    42         if( !(nbits % 8) ) *out++ = ' ';
    43     }
    44     *out = '\0';
    45 }
    47 static void printhex( char *out, int nbits, uint32_t value )
    48 {
    49     char tmp[10], *p = tmp;
    50     int i;
    52     sprintf( tmp, "%08X", value );
    53     for( i=32; i>0; i-=4, p++ ) {
    54         if( i <= nbits ) *out++ = *p;
    55         else *out++ = ' ';
    56     }
    57     *out = '\0';
    58 }
    63 gboolean
    64 on_mmio_delete_event                (GtkWidget       *widget,
    65                                      GdkEvent        *event,
    66                                      gpointer         user_data)
    67 {
    68     gtk_widget_hide(widget);
    69     return TRUE;
    70 }
    73 void on_mmio_close_clicked( GtkButton *button, gpointer user_data)
    74 {
    75     gtk_widget_hide( ((mmio_window_t)user_data)->window );
    76 }
    79 void on_trace_button_toggled           (GtkToggleButton *button,
    80                                         gpointer user_data)
    81 {
    82     struct mmio_region *io_rgn = (struct mmio_region *)user_data;
    83     gboolean isActive = gtk_toggle_button_get_active(button);
    84     if( io_rgn != NULL ) {
    85         io_rgn->trace_flag = isActive ? 1 : 0;
    86     }
    87 }
    89 static GtkCList *mmio_window_add_page( mmio_window_t mmio, char *name, struct mmio_region *io_rgn )
    90 {
    91     GtkCList *list;
    92     GtkWidget *scroll;
    93     GtkWidget *tab;
    94     GtkCheckButton *trace_button;
    95     GtkVBox *vbox;
    97     scroll = gtk_scrolled_window_new(NULL, NULL);
    98     gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scroll),
    99                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS );
   100     list = GTK_CLIST(gtk_clist_new(5));
   101     gtk_clist_set_column_width(list, 0, 70);
   102     gtk_clist_set_column_width(list, 1, 75);
   103     gtk_clist_set_column_width(list, 2, 70);
   104     gtk_clist_set_column_width(list, 3, 280);
   105     gtk_clist_set_column_width(list, 4, 160);
   106     gtk_clist_set_column_justification(list, 0, GTK_JUSTIFY_CENTER );
   107     gtk_clist_set_column_justification(list, 2, GTK_JUSTIFY_CENTER );
   108     gtk_clist_set_column_justification(list, 3, GTK_JUSTIFY_CENTER );
   109     gtk_clist_set_column_title(list, 0, _("Address"));
   110     gtk_clist_set_column_title(list, 1, _("Register"));
   111     gtk_clist_set_column_title(list, 2, _("Value"));
   112     gtk_clist_set_column_title(list, 3, _("Bit Pattern"));
   113     gtk_clist_set_column_title(list, 4, _("Description"));
   114     gtk_clist_column_titles_show(list);
   115     gtk_widget_modify_font( GTK_WIDGET(list), gui_fixed_font );
   116     tab = gtk_label_new(_(name));
   117     gtk_container_add( GTK_CONTAINER(scroll), GTK_WIDGET(list) );
   119     vbox = GTK_VBOX(gtk_vbox_new( FALSE, 0 ));
   120     gtk_container_add( GTK_CONTAINER(vbox), GTK_WIDGET(scroll) );
   122     trace_button = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_("Trace access")));
   123     if( io_rgn != NULL ) {
   124         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(trace_button), 
   125                 io_rgn->trace_flag ? TRUE : FALSE);
   126     }
   127     gtk_container_add( GTK_CONTAINER(vbox), GTK_WIDGET(trace_button) );
   128     gtk_box_set_child_packing( GTK_BOX(vbox), GTK_WIDGET(trace_button), 
   129                                FALSE, FALSE, 0, GTK_PACK_START );
   130     gtk_notebook_append_page( GTK_NOTEBOOK(mmio->notebook), GTK_WIDGET(vbox), tab );
   131     gtk_object_set_data( GTK_OBJECT(mmio->window), name, list );
   132     g_signal_connect ((gpointer) trace_button, "toggled",
   133                       G_CALLBACK (on_trace_button_toggled),
   134                       io_rgn);
   135     return list;
   136 }
   140 mmio_window_t mmio_window_new( const gchar *title )
   141 {
   142     mmio_window_t mmio = g_malloc0( sizeof(struct mmio_window_info) );
   144     int i, j;
   145     GtkCList *all_list;
   146     GtkWidget *vbox1;
   147     GtkWidget *hbuttonbox1;
   148     GtkWidget *mmr_close;
   150     mmio->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   151     gtk_window_set_title (GTK_WINDOW (mmio->window), title);
   152     gtk_window_set_default_size (GTK_WINDOW (mmio->window), 600, 600);
   154     vbox1 = gtk_vbox_new (FALSE, 0);
   155     gtk_container_add (GTK_CONTAINER (mmio->window), vbox1);
   157     mmio->notebook = gtk_notebook_new ();
   158     gtk_box_pack_start (GTK_BOX (vbox1), mmio->notebook, TRUE, TRUE, 0);
   159     gtk_notebook_set_tab_pos (GTK_NOTEBOOK (mmio->notebook), GTK_POS_LEFT);
   161     hbuttonbox1 = gtk_hbutton_box_new ();
   162     gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, FALSE, TRUE, 0);
   163     gtk_box_set_spacing (GTK_BOX (hbuttonbox1), 30);
   165     mmr_close = gtk_button_new_with_mnemonic (_("Close"));
   166     gtk_container_add (GTK_CONTAINER (hbuttonbox1), mmr_close);
   167     GTK_WIDGET_SET_FLAGS (mmr_close, GTK_CAN_DEFAULT);
   169     /* Add the mmio register data */
   170     all_list = mmio_window_add_page( mmio, "All", NULL );
   171     for( i=0; i < num_io_rgns; i++ ) {
   172         GtkCList *list = mmio_window_add_page( mmio, io_rgn[i]->id, io_rgn[i] );
   173         for( j=0; io_rgn[i]->ports[j].id != NULL; j++ ) {
   174             int sz = io_rgn[i]->ports[j].width;
   175             char addr[10], data[10], bits[40];
   176             char *arr[] = { addr, io_rgn[i]->ports[j].id, data, bits,
   177                     io_rgn[i]->ports[j].desc };
   178             sprintf( addr, "%08X",
   179                      io_rgn[i]->base + io_rgn[i]->ports[j].offset );
   180             printhex( data, sz, *io_rgn[i]->ports[j].val );
   181             printbits( bits, io_rgn[i]->ports[j].width,
   182                        *io_rgn[i]->ports[j].val );
   183             gtk_clist_append( list, arr );
   184             gtk_clist_append( all_list, arr );
   185         }
   186     }
   188     g_signal_connect ((gpointer) mmio->window, "delete_event",
   189                       G_CALLBACK (on_mmio_delete_event),
   190                       NULL);
   191     g_signal_connect ((gpointer) mmr_close, "clicked",
   192                       G_CALLBACK (on_mmio_close_clicked),
   193                       mmio);
   195     gtk_widget_show_all( mmio->window );
   196     return mmio;
   197 }
   199 void mmio_window_update( mmio_window_t mmio )
   200 {
   201     int i,j, count = 0;
   202     GtkCList *page, *all_page;
   203     char data[10], bits[40];
   205     all_page = GTK_CLIST(gtk_object_get_data( GTK_OBJECT(mmio->window), "All" ));
   207     for( i=0; i < num_io_rgns; i++ ) {
   208         page = GTK_CLIST(gtk_object_get_data( GTK_OBJECT(mmio->window),
   209                 io_rgn[i]->id ));
   210         for( j=0; io_rgn[i]->ports[j].id != NULL; j++ ) {
   211             if( *io_rgn[i]->ports[j].val !=
   212                 *(uint32_t *)(io_rgn[i]->save_mem+io_rgn[i]->ports[j].offset)){
   213                 int sz = io_rgn[i]->ports[j].width;
   214                 /* Changed */
   215                 printhex( data, sz, *io_rgn[i]->ports[j].val );
   216                 printbits( bits, sz, *io_rgn[i]->ports[j].val );
   218                 gtk_clist_set_text( page, j, 2, data );
   219                 gtk_clist_set_text( page, j, 3, bits );
   220                 gtk_clist_set_foreground( page, j, &gui_colour_changed );
   222                 gtk_clist_set_text( all_page, count, 2, data );
   223                 gtk_clist_set_text( all_page, count, 3, bits );
   224                 gtk_clist_set_foreground( all_page, count, &gui_colour_changed );
   226             } else {
   227                 gtk_clist_set_foreground( page, j, &gui_colour_normal );
   228                 gtk_clist_set_foreground( all_page, count, &gui_colour_normal );
   229             }
   230             count++;
   231         }
   232         memcpy( io_rgn[i]->save_mem, io_rgn[i]->mem, LXDREAM_PAGE_SIZE );
   233     }
   234 }
   236 void mmio_window_show( mmio_window_t mmio, gboolean show )
   237 {
   238     if( show ) {
   239         gtk_widget_show( mmio->window );
   240     } else {
   241         gtk_widget_hide( mmio->window );
   242     }
   243 }
.