Part of Slepp's ProjectsPastebinTURLImagebinFilebin
Feedback -- English French German Japanese
Create Upload Newest Tools Donate
Sign In | Create Account

Paste Description for Unnamed

change is at the bottom

Unnamed
Thursday, January 31st, 2008 at 10:15:34am UTC 

  1. /***************************************************************************
  2.  *             __________               __   ___.
  3.  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
  4.  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
  5.  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
  6.  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
  7.  *                     \/            \/     \/    \/            \/
  8.  * $Id$
  9.  *
  10.  * Copyright (C) 2005 by Dave Chapman
  11.  *
  12.  * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
  13.  * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach
  14.  *
  15.  * All files in this archive are subject to the GNU General Public License.
  16.  * See the file COPYING in the source tree root for full license agreement.
  17.  *
  18.  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  19.  * KIND, either express or implied.
  20.  *
  21.  ****************************************************************************/
  22. #include "config.h"
  23.  
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdarg.h>
  28. #include "cpu.h"
  29. #include "system.h"
  30. #include "lcd.h"
  31. #include "kernel.h"
  32. #include "thread.h"
  33. #include "ata.h"
  34. #include "fat.h"
  35. #include "disk.h"
  36. #include "font.h"
  37. #include "adc.h"
  38. #include "backlight.h"
  39. #include "panic.h"
  40. #include "power.h"
  41. #include "file.h"
  42. #include "common.h"
  43. #include "hwcompat.h"
  44.  
  45. #define XSC(X) #X
  46. #define SC(X) XSC(X)
  47.  
  48. /* Maximum allowed firmware image size. The largest known current
  49.    (December 2006) firmware is about 7.5MB (Apple's firmware for the ipod video)
  50.    so we set this to 8MB. */
  51. #define MAX_LOADSIZE (8*1024*1024)
  52.  
  53. /* A buffer to load the Linux kernel or Rockbox into */
  54. unsigned char *loadbuffer = (unsigned char *)DRAM_START;
  55.  
  56. /* Bootloader version */
  57. char version[] = APPSVERSION;
  58.  
  59. #define BUTTON_LEFT  1
  60. #define BUTTON_MENU  2
  61. #define BUTTON_RIGHT 3
  62. #define BUTTON_PLAY  4
  63. #define BUTTON_HOLD  5
  64.  
  65. #if CONFIG_KEYPAD == IPOD_4G_PAD && !defined(IPOD_MINI)
  66. /* check if number of seconds has past */
  67. int timer_check(int clock_start, unsigned int usecs)
  68. {
  69.     if ((USEC_TIMER - clock_start) >= usecs) {
  70.         return 1;
  71.     } else {
  72.         return 0;
  73.     }
  74. }
  75.  
  76. static void ser_opto_keypad_cfg(int val)
  77. {
  78.     int start_time;
  79.  
  80.     GPIOB_ENABLE &=~ 0x80;
  81.  
  82.     outl(inl(0x7000c104) | 0xc000000, 0x7000c104);
  83.     outl(val, 0x7000c120);
  84.     outl(inl(0x7000c100) | 0x80000000, 0x7000c100);
  85.  
  86.     GPIOB_OUTPUT_VAL &=~ 0x10;
  87.     GPIOB_OUTPUT_EN  |=  0x10;
  88.  
  89.     start_time = USEC_TIMER;
  90.     do {
  91.         if ((inl(0x7000c104) & 0x80000000) == 0) {
  92.             break;
  93.         }
  94.     } while (timer_check(start_time, 1500) != 0);
  95.  
  96.     outl(inl(0x7000c100) & ~0x80000000, 0x7000c100);
  97.  
  98.     GPIOB_ENABLE     |= 0x80;
  99.     GPIOB_OUTPUT_VAL |= 0x10;
  100.     GPIOB_OUTPUT_EN  &=~0x10;
  101.  
  102.     outl(inl(0x7000c104) | 0xc000000, 0x7000c104);
  103.     outl(inl(0x7000c100) | 0x60000000, 0x7000c100);
  104. }
  105.  
  106. int opto_keypad_read(void)
  107. {
  108.     int loop_cnt, had_io = 0;
  109.  
  110.     for (loop_cnt = 5; loop_cnt != 0;)
  111.     {
  112.         int key_pressed = 0;
  113.         int start_time;
  114.         unsigned int key_pad_val;
  115.  
  116.         ser_opto_keypad_cfg(0x8000023a);
  117.  
  118.         start_time = USEC_TIMER;
  119.         do {
  120.             if (inl(0x7000c104) & 0x4000000) {
  121.                 had_io = 1;
  122.                 break;
  123.             }
  124.  
  125.             if (had_io != 0) {
  126.                 break;
  127.             }
  128.         } while (timer_check(start_time, 1500) != 0);
  129.  
  130.         key_pad_val = inl(0x7000c140);
  131.         if ((key_pad_val & ~0x7fff0000) != 0x8000023a) {
  132.             loop_cnt--;
  133.         } else {
  134.             key_pad_val = (key_pad_val << 11) >> 27;
  135.             key_pressed = 1;
  136.         }
  137.  
  138.         outl(inl(0x7000c100) | 0x60000000, 0x7000c100);
  139.         outl(inl(0x7000c104) | 0xc000000, 0x7000c104);
  140.  
  141.         if (key_pressed != 0) {
  142.             return key_pad_val ^ 0x1f;
  143.         }
  144.     }
  145.  
  146.     return 0;
  147. }
  148. #endif
  149.  
  150. static int key_pressed(void)
  151. {
  152.     unsigned char state;
  153.  
  154. #if CONFIG_KEYPAD == IPOD_4G_PAD
  155. #ifdef IPOD_MINI /* mini 1G only */
  156.     state = GPIOA_INPUT_VAL & 0x3f;
  157.     if ((state & 0x10) == 0) return BUTTON_LEFT;
  158.     if ((state & 0x2) == 0) return BUTTON_MENU;
  159.     if ((state & 0x4) == 0) return BUTTON_PLAY;
  160.     if ((state & 0x8) == 0) return BUTTON_RIGHT;
  161. #else
  162.     state = opto_keypad_read();
  163.     if ((state & 0x4) == 0) return BUTTON_LEFT;
  164.     if ((state & 0x10) == 0) return BUTTON_MENU;
  165.     if ((state & 0x8) == 0) return BUTTON_PLAY;
  166.     if ((state & 0x2) == 0) return BUTTON_RIGHT;
  167. #endif
  168. #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_1G2G_PAD)
  169.     state = GPIOA_INPUT_VAL;
  170.     if ((state & 0x08) == 0) return BUTTON_LEFT;
  171.     if ((state & 0x10) == 0) return BUTTON_MENU;
  172.     if ((state & 0x04) == 0) return BUTTON_PLAY;
  173.     if ((state & 0x01) == 0) return BUTTON_RIGHT;
  174. #endif
  175.     return 0;
  176. }
  177.  
  178. bool button_hold(void)
  179. {
  180. #if CONFIG_KEYPAD == IPOD_1G2G_PAD
  181.     return (GPIOA_INPUT_VAL & 0x20);
  182. #else
  183.     return !(GPIOA_INPUT_VAL & 0x20);
  184. #endif
  185. }
  186.  
  187. void fatal_error(void)
  188. {
  189.     extern int line;
  190.     bool holdstatus=false;
  191.  
  192.     /* System font is 6 pixels wide */
  193. #if defined(IPOD_1G2G) || defined(IPOD_3G)
  194.     printf("Hold MENU+PLAY to");
  195.     printf("reboot then REW+FF");
  196.     printf("for disk mode");
  197. #elif LCD_WIDTH >= (30*6)
  198.     printf("Hold MENU+SELECT to reboot");
  199.     printf("then SELECT+PLAY for disk mode");
  200. #else
  201.     printf("Hold MENU+SELECT to");
  202.     printf("reboot then SELECT+PLAY");
  203.     printf("for disk mode");
  204. #endif
  205.     lcd_update();
  206.  
  207.     while (1) {
  208.         if (button_hold() != holdstatus) {
  209.             if (button_hold()) {
  210.                 holdstatus=true;
  211.                 lcd_puts(0, line, "Hold switch on!");
  212.             } else {
  213.                 holdstatus=false;
  214.                 lcd_puts(0, line, "               ");
  215.             }
  216.             lcd_update();
  217.         }
  218.         udelay(100000); /* 100ms */
  219.     }
  220.  
  221. }
  222.  
  223.  
  224. void* main(void)
  225. {
  226.     char buf[256];
  227.     int i;
  228.     int btn;
  229.     int rc;
  230.     bool haveretailos;
  231.     bool button_was_held;
  232.     struct partinfo* pinfo;
  233.     unsigned short* identify_info;
  234.  
  235.     /* Check the button hold status as soon as possible - to
  236.        give the user maximum chance to turn it off in order to
  237.        reset the settings in rockbox. */
  238.     button_was_held = button_hold();
  239.  
  240.     system_init();
  241.     kernel_init();
  242.  
  243. #ifndef HAVE_BACKLIGHT_INVERSION
  244.     backlight_init(); /* Turns on the backlight */
  245. #endif
  246.  
  247.     lcd_init();
  248.     font_init();
  249.  
  250. #ifdef HAVE_LCD_COLOR
  251.     lcd_set_foreground(LCD_WHITE);
  252.     lcd_set_background(LCD_BLACK);
  253.     lcd_clear_display();
  254. #endif
  255.  
  256. #if 0
  257.     /* ADC and button drivers are not yet implemented */
  258.     adc_init();
  259.     button_init();
  260. #endif
  261.  
  262.     btn=key_pressed();
  263.  
  264.     /* Enable bootloader messages */
  265.     if (btn==BUTTON_RIGHT)
  266.         verbose = true;
  267.  
  268.     lcd_setfont(FONT_SYSFIXED);
  269.  
  270.     printf("Rockbox boot loader");
  271.     printf("Version: %s", version);
  272.     printf("IPOD version: 0x%08x", IPOD_HW_REVISION);
  273.  
  274.     i=ata_init();
  275.     if (i==0) {
  276.       identify_info=ata_get_identify();
  277.       /* Show model */
  278.       for (i=0; i < 20; i++) {
  279.         ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]);
  280.       }
  281.       buf[40]=0;
  282.       for (i=39; i && buf[i]==' '; i--) {
  283.         buf[i]=0;
  284.       }
  285.       printf(buf);
  286.     } else {
  287.       printf("ATA: %d", i);
  288.     }
  289.  
  290.     disk_init();
  291.     rc = disk_mount_all();
  292.     if (rc<=0)
  293.     {
  294.         printf("No partition found");
  295.         fatal_error();
  296.     }
  297.  
  298.     pinfo = disk_partinfo(1);
  299.     printf("Partition 1: 0x%02x %ld MB",
  300.            pinfo->type, pinfo->size / 2048);
  301.  
  302.     if (button_was_held || (btn==BUTTON_MENU)) {
  303.         /* If either the hold switch was on, or the Menu button was held, then
  304.            try the Apple firmware */
  305.  
  306.         printf("Loading original firmware...");
  307.    
  308.         /* First try an apple_os.ipod file on the FAT32 partition
  309.            (either in .rockbox or the root)
  310.          */
  311.    
  312.        printf("Loading Rockbox...");
  313.         rc=load_firmware(loadbuffer, BOOTFILE, MAX_LOADSIZE);
  314.         if (rc < EOK) {
  315.             printf("Error!");
  316.             printf("Can't load rockbox.ipod:");
  317.             printf(strerror(rc));
  318.         } else {
  319.             printf("Rockbox loaded.");
  320.             return (void*)DRAM_START;
  321.         }
  322.        
  323.         /* Everything failed - just loop forever */
  324.         printf("No RetailOS detected");
  325.        
  326.     } else if (btn==BUTTON_PLAY) {
  327.         printf("Loading Linux...");
  328.         rc=load_raw_firmware(loadbuffer, "/linux.bin", MAX_LOADSIZE);
  329.         if (rc < EOK) {
  330.             printf("Error!");
  331.             printf("Can't load linux.bin:");
  332.             printf(strerror(rc));
  333.         } else {
  334.             return (void*)DRAM_START;
  335.         }
  336.     } else {
  337.         printf("Loading Rockbox...");
  338.          rc=load_firmware(loadbuffer, "apple_os.ipod", MAX_LOADSIZE);
  339.    
  340.         if (rc == EOK) {
  341.             printf("apple_os.ipod loaded.");
  342.             return (void*)DRAM_START;
  343.         } else if (rc == EFILE_NOT_FOUND) {
  344.             /* If apple_os.ipod doesn't exist, then check if there is an Apple
  345.                firmware image in RAM  */
  346.             haveretailos = (memcmp((void*)(DRAM_START+0x20),"portalplayer",12)==0);
  347.             if (haveretailos) {
  348.                 /* We have a copy of the retailos in RAM, lets just run it. */
  349.                 return (void*)DRAM_START;
  350.             }
  351.         } else if (rc < EFILE_NOT_FOUND) {
  352.             printf("Error!");
  353.             printf("Can't load apple_os.ipod:");
  354.             printf(strerror(rc));
  355.         }
  356.     }
  357.    
  358.     /* If we get to here, then we haven't been able to load any firmware */
  359.     fatal_error();
  360.    
  361.     /* We never get here, but keep gcc happy */
  362.     return (void*)0;
  363. }
  364.  
  365. /* These functions are present in the firmware library, but we reimplement
  366.    them here because the originals do a lot more than we want */
  367. void usb_acknowledge(void)
  368. {
  369. }
  370.  
  371. void usb_wait_for_disconnect(void)
  372. {
  373. }

Update the Post

Either update this post and resubmit it with changes, or make a new post.

You may also comment on this post.

update paste below
details of the post (optional)

Note: Only the paste content is required, though the following information can be useful to others.

Save name / title?

(space separated, optional)



Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.

comments powered by Disqus
worth-right