filename | src/gtkui/mmio_win.c |
changeset | 537:d924be49e192 |
prev | 508:ccd2c10edfe6 |
next | 561:533f6b478071 |
next | 586:2a3ba82cf243 |
author | nkeynes |
date | Tue Nov 20 10:27:58 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Move gtk UI into gtkui subdir (prep for non-gtk builds), and protect with an automake conditional |
file | annotate | diff | log | raw |
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +00001.2 +++ b/src/gtkui/mmio_win.c Tue Nov 20 10:27:58 2007 +00001.3 @@ -0,0 +1,241 @@1.4 +/**1.5 + * $Id: mmio_win.c,v 1.11 2007-11-10 04:45:29 nkeynes Exp $1.6 + *1.7 + * Implements the MMIO register viewing window1.8 + *1.9 + * Copyright (c) 2005 Nathan Keynes.1.10 + *1.11 + * This program is free software; you can redistribute it and/or modify1.12 + * it under the terms of the GNU General Public License as published by1.13 + * the Free Software Foundation; either version 2 of the License, or1.14 + * (at your option) any later version.1.15 + *1.16 + * This program is distributed in the hope that it will be useful,1.17 + * but WITHOUT ANY WARRANTY; without even the implied warranty of1.18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1.19 + * GNU General Public License for more details.1.20 + */1.21 +1.22 +#include <stdint.h>1.23 +#include <string.h>1.24 +#include <glib/gi18n.h>1.25 +#include "gtkui/gtkui.h"1.26 +#include "mem.h"1.27 +#include "mmio.h"1.28 +1.29 +1.30 +struct mmio_window_info {1.31 + GtkWidget *window;1.32 + GtkWidget *notebook;1.33 +};1.34 +1.35 +static void printbits( char *out, int nbits, uint32_t value )1.36 +{1.37 + if( nbits < 32 ) {1.38 + int i;1.39 + for( i=32; i>nbits; i-- ) {1.40 + if( !(i % 8) ) *out++ = ' ';1.41 + *out++ = ' ';1.42 + }1.43 + }1.44 + while( nbits > 0 ) {1.45 + *out++ = (value&(1<<--nbits) ? '1' : '0');1.46 + if( !(nbits % 8) ) *out++ = ' ';1.47 + }1.48 + *out = '\0';1.49 +}1.50 +1.51 +static void printhex( char *out, int nbits, uint32_t value )1.52 +{1.53 + char tmp[10], *p = tmp;1.54 + int i;1.55 +1.56 + sprintf( tmp, "%08X", value );1.57 + for( i=32; i>0; i-=4, p++ ) {1.58 + if( i <= nbits ) *out++ = *p;1.59 + else *out++ = ' ';1.60 + }1.61 + *out = '\0';1.62 +}1.63 +1.64 +1.65 +1.66 +1.67 +gboolean1.68 +on_mmio_delete_event (GtkWidget *widget,1.69 + GdkEvent *event,1.70 + gpointer user_data)1.71 +{1.72 + gtk_widget_hide(widget);1.73 + return TRUE;1.74 +}1.75 +1.76 +1.77 +void on_mmio_close_clicked( GtkButton *button, gpointer user_data)1.78 +{1.79 + gtk_widget_hide( ((mmio_window_t)user_data)->window );1.80 +}1.81 +1.82 +1.83 +void on_trace_button_toggled (GtkToggleButton *button,1.84 + gpointer user_data)1.85 +{1.86 + struct mmio_region *io_rgn = (struct mmio_region *)user_data;1.87 + gboolean isActive = gtk_toggle_button_get_active(button);1.88 + if( io_rgn != NULL ) {1.89 + io_rgn->trace_flag = isActive ? 1 : 0;1.90 + }1.91 +}1.92 +1.93 +static GtkCList *mmio_window_add_page( mmio_window_t mmio, char *name, struct mmio_region *io_rgn )1.94 +{1.95 + GtkCList *list;1.96 + GtkWidget *scroll;1.97 + GtkWidget *tab;1.98 + GtkCheckButton *trace_button;1.99 + GtkVBox *vbox;1.100 +1.101 + scroll = gtk_scrolled_window_new(NULL, NULL);1.102 + gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scroll),1.103 + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS );1.104 + list = GTK_CLIST(gtk_clist_new(5));1.105 + gtk_clist_set_column_width(list, 0, 70);1.106 + gtk_clist_set_column_width(list, 1, 75);1.107 + gtk_clist_set_column_width(list, 2, 70);1.108 + gtk_clist_set_column_width(list, 3, 280);1.109 + gtk_clist_set_column_width(list, 4, 160);1.110 + gtk_clist_set_column_justification(list, 0, GTK_JUSTIFY_CENTER );1.111 + gtk_clist_set_column_justification(list, 2, GTK_JUSTIFY_CENTER );1.112 + gtk_clist_set_column_justification(list, 3, GTK_JUSTIFY_CENTER );1.113 + gtk_clist_set_column_title(list, 0, _("Address"));1.114 + gtk_clist_set_column_title(list, 1, _("Register"));1.115 + gtk_clist_set_column_title(list, 2, _("Value"));1.116 + gtk_clist_set_column_title(list, 3, _("Bit Pattern"));1.117 + gtk_clist_set_column_title(list, 4, _("Description"));1.118 + gtk_clist_column_titles_show(list);1.119 + gtk_widget_modify_font( GTK_WIDGET(list), gui_fixed_font );1.120 + tab = gtk_label_new(_(name));1.121 + gtk_container_add( GTK_CONTAINER(scroll), GTK_WIDGET(list) );1.122 +1.123 + vbox = GTK_VBOX(gtk_vbox_new( FALSE, 0 ));1.124 + gtk_container_add( GTK_CONTAINER(vbox), GTK_WIDGET(scroll) );1.125 +1.126 + trace_button = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_("Trace access")));1.127 + gtk_container_add( GTK_CONTAINER(vbox), GTK_WIDGET(trace_button) );1.128 + gtk_box_set_child_packing( GTK_BOX(vbox), GTK_WIDGET(trace_button),1.129 + FALSE, FALSE, 0, GTK_PACK_START );1.130 + gtk_notebook_append_page( GTK_NOTEBOOK(mmio->notebook), GTK_WIDGET(vbox), tab );1.131 + gtk_object_set_data( GTK_OBJECT(mmio->window), name, list );1.132 + g_signal_connect ((gpointer) trace_button, "toggled",1.133 + G_CALLBACK (on_trace_button_toggled),1.134 + io_rgn);1.135 + return list;1.136 +}1.137 +1.138 +1.139 +1.140 +mmio_window_t mmio_window_new( const gchar *title )1.141 +{1.142 + mmio_window_t mmio = g_malloc0( sizeof(struct mmio_window_info) );1.143 +1.144 + int i, j;1.145 + GtkCList *all_list;1.146 + GtkWidget *vbox1;1.147 + GtkWidget *hbuttonbox1;1.148 + GtkWidget *mmr_close;1.149 +1.150 + mmio->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);1.151 + gtk_window_set_title (GTK_WINDOW (mmio->window), title);1.152 + gtk_window_set_default_size (GTK_WINDOW (mmio->window), 600, 600);1.153 +1.154 + vbox1 = gtk_vbox_new (FALSE, 0);1.155 + gtk_container_add (GTK_CONTAINER (mmio->window), vbox1);1.156 +1.157 + mmio->notebook = gtk_notebook_new ();1.158 + gtk_box_pack_start (GTK_BOX (vbox1), mmio->notebook, TRUE, TRUE, 0);1.159 + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (mmio->notebook), GTK_POS_LEFT);1.160 +1.161 + hbuttonbox1 = gtk_hbutton_box_new ();1.162 + gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, FALSE, TRUE, 0);1.163 + gtk_box_set_spacing (GTK_BOX (hbuttonbox1), 30);1.164 +1.165 + mmr_close = gtk_button_new_with_mnemonic (_("Close"));1.166 + gtk_container_add (GTK_CONTAINER (hbuttonbox1), mmr_close);1.167 + GTK_WIDGET_SET_FLAGS (mmr_close, GTK_CAN_DEFAULT);1.168 +1.169 + /* Add the mmio register data */1.170 + all_list = mmio_window_add_page( mmio, "All", NULL );1.171 + for( i=0; i < num_io_rgns; i++ ) {1.172 + GtkCList *list = mmio_window_add_page( mmio, io_rgn[i]->id, io_rgn[i] );1.173 + for( j=0; io_rgn[i]->ports[j].id != NULL; j++ ) {1.174 + int sz = io_rgn[i]->ports[j].width;1.175 + char addr[10], data[10], bits[40];1.176 + char *arr[] = { addr, io_rgn[i]->ports[j].id, data, bits,1.177 + io_rgn[i]->ports[j].desc };1.178 + sprintf( addr, "%08X",1.179 + io_rgn[i]->base + io_rgn[i]->ports[j].offset );1.180 + printhex( data, sz, *io_rgn[i]->ports[j].val );1.181 + printbits( bits, io_rgn[i]->ports[j].width,1.182 + *io_rgn[i]->ports[j].val );1.183 + gtk_clist_append( list, arr );1.184 + gtk_clist_append( all_list, arr );1.185 + }1.186 + }1.187 +1.188 + g_signal_connect ((gpointer) mmio->window, "delete_event",1.189 + G_CALLBACK (on_mmio_delete_event),1.190 + NULL);1.191 + g_signal_connect ((gpointer) mmr_close, "clicked",1.192 + G_CALLBACK (on_mmio_close_clicked),1.193 + mmio);1.194 +1.195 + gtk_widget_show_all( mmio->window );1.196 + return mmio;1.197 +}1.198 +1.199 +void mmio_window_update( mmio_window_t mmio )1.200 +{1.201 + int i,j, count = 0;1.202 + GtkCList *page, *all_page;1.203 + char data[10], bits[40];1.204 +1.205 + all_page = GTK_CLIST(gtk_object_get_data( GTK_OBJECT(mmio->window), "All" ));1.206 +1.207 + for( i=0; i < num_io_rgns; i++ ) {1.208 + page = GTK_CLIST(gtk_object_get_data( GTK_OBJECT(mmio->window),1.209 + io_rgn[i]->id ));1.210 + for( j=0; io_rgn[i]->ports[j].id != NULL; j++ ) {1.211 + if( *io_rgn[i]->ports[j].val !=1.212 + *(uint32_t *)(io_rgn[i]->save_mem+io_rgn[i]->ports[j].offset)){1.213 + int sz = io_rgn[i]->ports[j].width;1.214 + /* Changed */1.215 + printhex( data, sz, *io_rgn[i]->ports[j].val );1.216 + printbits( bits, sz, *io_rgn[i]->ports[j].val );1.217 +1.218 + gtk_clist_set_text( page, j, 2, data );1.219 + gtk_clist_set_text( page, j, 3, bits );1.220 + gtk_clist_set_foreground( page, j, &gui_colour_changed );1.221 +1.222 + gtk_clist_set_text( all_page, count, 2, data );1.223 + gtk_clist_set_text( all_page, count, 3, bits );1.224 + gtk_clist_set_foreground( all_page, count, &gui_colour_changed );1.225 +1.226 + } else {1.227 + gtk_clist_set_foreground( page, j, &gui_colour_normal );1.228 + gtk_clist_set_foreground( all_page, count, &gui_colour_normal );1.229 + }1.230 + count++;1.231 + }1.232 + memcpy( io_rgn[i]->save_mem, io_rgn[i]->mem, PAGE_SIZE );1.233 + }1.234 +}1.235 +1.236 +void mmio_window_show( mmio_window_t mmio, gboolean show )1.237 +{1.238 + if( show ) {1.239 + gtk_widget_show( mmio->window );1.240 + } else {1.241 + gtk_widget_hide( mmio->window );1.242 + }1.243 +}1.244 +
.