+// burn the flash
+
+ case FLASH_Burn: {
+
+ volatile unsigned long burn_addr;
+ unsigned long flags;
+ int i;
+ unsigned char *rom;
+
+
+ struct lcd_display display;
+
+ if(copy_from_user(&display, (struct lcd_display*)arg, sizeof(struct lcd_display)))
+ return -EFAULT;
+ rom = (unsigned char *) kmalloc((128),GFP_ATOMIC);
+ if ( rom == NULL ) {
+ printk ("broken\n");
+ return 1;
+ }
+
+ printk("Churning and Burning -");
+ save_flags(flags);
+ for (i=0; i<FLASH_SIZE; i=i+128) {
+
+ if(copy_from_user(rom, display.RomImage + i, 128))
+ return -EFAULT;
+ burn_addr = kFlashBase + i;
+ cli();
+ for ( index = 0; index < ( 128 ) ; index++ )
+ {
+
+ WRITE_FLASH( kFlash_Addr1, kFlash_Data1 );
+ WRITE_FLASH( kFlash_Addr2, kFlash_Data2 );
+ WRITE_FLASH( kFlash_Addr1, kFlash_Prog );
+ *((volatile unsigned char *)burn_addr) = (volatile unsigned char) rom[index];
+
+ while ( (!dqpoll(burn_addr,(volatile unsigned char) rom[index])) && (!timeout(burn_addr)) ) {
+ }
+ burn_addr++;
+ }
+ restore_flags(flags);
+ if ( *((volatile unsigned char *)(burn_addr-1)) == (volatile unsigned char) rom[index-1] ) {
+ } else if (timeout) {
+ printk("Program timed out\r\n");
+ }