nkeynes@2: #include nkeynes@2: #include nkeynes@2: #include "interface.h" nkeynes@2: #include "gui.h" nkeynes@2: #include "mem.h" nkeynes@2: #include "mmio.h" nkeynes@2: nkeynes@2: GtkWidget *mmr_win; nkeynes@2: GtkNotebook *mmr_book; nkeynes@2: nkeynes@2: static void printbits( char *out, int nbits, uint32_t value ) nkeynes@2: { nkeynes@2: if( nbits < 32 ) { nkeynes@2: int i; nkeynes@2: for( i=32; i>nbits; i-- ) { nkeynes@2: if( !(i % 8) ) *out++ = ' '; nkeynes@2: *out++ = ' '; nkeynes@2: } nkeynes@2: } nkeynes@2: while( nbits > 0 ) { nkeynes@2: *out++ = (value&(1<<--nbits) ? '1' : '0'); nkeynes@2: if( !(nbits % 8) ) *out++ = ' '; nkeynes@2: } nkeynes@2: *out = '\0'; nkeynes@2: } nkeynes@2: nkeynes@2: static void printhex( char *out, int nbits, uint32_t value ) nkeynes@2: { nkeynes@2: char tmp[10], *p = tmp; nkeynes@2: int i; nkeynes@2: nkeynes@2: sprintf( tmp, "%08X", value ); nkeynes@2: for( i=32; i>0; i-=4, p++ ) { nkeynes@2: if( i <= nbits ) *out++ = *p; nkeynes@2: else *out++ = ' '; nkeynes@2: } nkeynes@2: *out = '\0'; nkeynes@2: } nkeynes@2: nkeynes@2: nkeynes@2: static GtkCList *create_mmr_page( char *name ) nkeynes@2: { nkeynes@2: GtkCList *list; nkeynes@2: GtkWidget *scroll; nkeynes@2: GtkWidget *tab; nkeynes@2: nkeynes@2: scroll = gtk_scrolled_window_new(NULL, NULL); nkeynes@2: gtk_widget_show( scroll ); nkeynes@2: gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scroll), nkeynes@2: GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS ); nkeynes@2: list = GTK_CLIST(gtk_clist_new(5)); nkeynes@2: gtk_clist_set_column_width(list, 0, 60); nkeynes@2: gtk_clist_set_column_width(list, 1, 50); nkeynes@2: gtk_clist_set_column_width(list, 2, 60); nkeynes@2: gtk_clist_set_column_width(list, 3, 220); nkeynes@2: gtk_clist_set_column_width(list, 4, 160); nkeynes@2: gtk_clist_set_column_justification(list, 0, GTK_JUSTIFY_CENTER ); nkeynes@2: gtk_clist_set_column_justification(list, 2, GTK_JUSTIFY_CENTER ); nkeynes@2: gtk_clist_set_column_justification(list, 3, GTK_JUSTIFY_CENTER ); nkeynes@2: gtk_clist_set_column_title(list, 0, "Address"); nkeynes@2: gtk_clist_set_column_title(list, 1, "Register"); nkeynes@2: gtk_clist_set_column_title(list, 2, "Value"); nkeynes@2: gtk_clist_set_column_title(list, 3, "Bit Pattern"); nkeynes@2: gtk_clist_set_column_title(list, 4, "Description"); nkeynes@2: gtk_clist_column_titles_show(list); nkeynes@2: gtk_widget_modify_font( GTK_WIDGET(list), fixed_list_font ); nkeynes@2: gtk_widget_show( GTK_WIDGET(list) ); nkeynes@2: tab = gtk_label_new(_(name)); nkeynes@2: gtk_widget_show( tab ); nkeynes@2: gtk_container_add( GTK_CONTAINER(scroll), GTK_WIDGET(list) ); nkeynes@2: gtk_notebook_append_page( mmr_book, scroll, tab ); nkeynes@2: gtk_object_set_data( GTK_OBJECT(mmr_win), name, list ); nkeynes@2: return list; nkeynes@2: } nkeynes@2: nkeynes@2: void update_mmr_win( void ) nkeynes@2: { nkeynes@2: int i,j, count = 0; nkeynes@2: GtkCList *page, *all_page; nkeynes@2: char data[10], bits[40]; nkeynes@2: nkeynes@2: all_page = GTK_CLIST(gtk_object_get_data( GTK_OBJECT(mmr_win), "All" )); nkeynes@2: nkeynes@2: for( i=1; i < num_io_rgns; i++ ) { nkeynes@2: page = GTK_CLIST(gtk_object_get_data( GTK_OBJECT(mmr_win), nkeynes@2: io_rgn[i]->id )); nkeynes@2: for( j=0; io_rgn[i]->ports[j].id != NULL; j++ ) { nkeynes@2: if( *io_rgn[i]->ports[j].val != nkeynes@2: *(uint32_t *)(io_rgn[i]->save_mem+io_rgn[i]->ports[j].offset)){ nkeynes@2: int sz = io_rgn[i]->ports[j].width; nkeynes@2: /* Changed */ nkeynes@2: printhex( data, sz, *io_rgn[i]->ports[j].val ); nkeynes@2: printbits( bits, sz, *io_rgn[i]->ports[j].val ); nkeynes@2: nkeynes@2: gtk_clist_set_text( page, j, 2, data ); nkeynes@2: gtk_clist_set_text( page, j, 3, bits ); nkeynes@2: gtk_clist_set_foreground( page, j, &clrChanged ); nkeynes@2: nkeynes@2: gtk_clist_set_text( all_page, count, 2, data ); nkeynes@2: gtk_clist_set_text( all_page, count, 3, bits ); nkeynes@2: gtk_clist_set_foreground( all_page, count, &clrChanged ); nkeynes@2: nkeynes@2: } else { nkeynes@2: gtk_clist_set_foreground( page, j, &clrNormal ); nkeynes@2: gtk_clist_set_foreground( all_page, count, &clrNormal ); nkeynes@2: } nkeynes@2: count++; nkeynes@2: } nkeynes@2: memcpy( io_rgn[i]->save_mem, io_rgn[i]->mem, PAGE_SIZE ); nkeynes@2: } nkeynes@2: } nkeynes@2: nkeynes@2: void init_mmr_win( void ) nkeynes@2: { nkeynes@2: int i, j; nkeynes@2: GtkCList *all_list; nkeynes@2: mmr_win = create_mmr_win(); nkeynes@2: mmr_book = GTK_NOTEBOOK( gtk_object_get_data( GTK_OBJECT(mmr_win), "mmr_notebook" )); nkeynes@2: nkeynes@2: /* kill the dummy page glade insists on adding */ nkeynes@2: gtk_notebook_remove_page( mmr_book, 0 ); nkeynes@2: nkeynes@2: all_list = create_mmr_page( "All" ); nkeynes@2: for( i=1; i < num_io_rgns; i++ ) { nkeynes@2: GtkCList *list = create_mmr_page( io_rgn[i]->id ); nkeynes@2: nkeynes@2: for( j=0; io_rgn[i]->ports[j].id != NULL; j++ ) { nkeynes@2: int sz = io_rgn[i]->ports[j].width; nkeynes@2: char addr[10], data[10], bits[40]; nkeynes@2: char *arr[] = { addr, io_rgn[i]->ports[j].id, data, bits, nkeynes@2: io_rgn[i]->ports[j].desc }; nkeynes@2: sprintf( addr, "%08X", nkeynes@2: io_rgn[i]->base + io_rgn[i]->ports[j].offset ); nkeynes@2: printhex( data, sz, *io_rgn[i]->ports[j].val ); nkeynes@2: printbits( bits, io_rgn[i]->ports[j].width, nkeynes@2: *io_rgn[i]->ports[j].val ); nkeynes@2: gtk_clist_append( list, arr ); nkeynes@2: gtk_clist_append( all_list, arr ); nkeynes@2: } nkeynes@2: } nkeynes@2: } nkeynes@2: nkeynes@2: void mmr_open_win( void ) nkeynes@2: { nkeynes@2: gtk_widget_show( mmr_win ); nkeynes@2: } nkeynes@2: nkeynes@2: void mmr_close_win( void ) nkeynes@2: { nkeynes@2: gtk_widget_hide( mmr_win ); nkeynes@2: }