Advertisement
Guest User

Untitled

a guest
Nov 12th, 2020
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.35 KB | None | 0 0
  1. /***************************************************************************
  2. * __________ __ ___.
  3. * Open \______ \ ____ ____ | | _\_ |__ _______ ___
  4. * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
  5. * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
  6. * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
  7. * \/ \/ \/ \/ \/
  8. * $Id$
  9. *
  10. * Copyright (C) 2007 by Linus Nielsen Feltzing
  11. *
  12. * This program is free software; you can redistribute it and/or
  13. * modify it under the terms of the GNU General Public License
  14. * as published by the Free Software Foundation; either version 2
  15. * of the License, or (at your option) any later version.
  16. *
  17. * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  18. * KIND, either express or implied.
  19. *
  20. ****************************************************************************/
  21. #include "config.h"
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include "inttypes.h"
  26. #include "string.h"
  27. #include "cpu.h"
  28. #include "system.h"
  29. #include "lcd.h"
  30. #include "lcd-remote.h"
  31. #include "scroll_engine.h"
  32. #include "../kernel-internal.h"
  33. #include "storage.h"
  34. #include "file_internal.h"
  35. #include "usb.h"
  36. #include "disk.h"
  37. #include "font.h"
  38. #include "adc.h"
  39. #include "backlight.h"
  40. #include "backlight-target.h"
  41. #include "button.h"
  42. #include "panic.h"
  43. #include "power.h"
  44. #include "powermgmt.h"
  45. #include "file.h"
  46. #include "pcf50606.h"
  47. #include "common.h"
  48. #include "rb-loader.h"
  49. #include "loader_strerror.h"
  50. #include "rbunicode.h"
  51. #include "isp1362.h"
  52. #include "version.h"
  53.  
  54. #include <stdarg.h>
  55.  
  56. /* Maximum allowed firmware image size. 10MB is more than enough */
  57. #define MAX_LOADSIZE (10*1024*1024)
  58.  
  59. #define DRAM_START 0x31000000
  60.  
  61. /* Reset the cookie for the crt0 crash check */
  62. inline void __reset_cookie(void)
  63. {
  64. asm(" move.l #0,%d0");
  65. asm(" move.l %d0,0x10017ffc");
  66. }
  67.  
  68. void start_iriver_fw(void)
  69. {
  70. asm(" move.w #0x2700,%sr");
  71. __reset_cookie();
  72. asm(" movec.l %d0,%vbr");
  73. asm(" move.l 0,%sp");
  74. asm(" lea.l 8,%a0");
  75. asm(" jmp (%a0)");
  76. }
  77.  
  78. void start_firmware(void)
  79. {
  80. asm(" move.w #0x2700,%sr");
  81. __reset_cookie();
  82. asm(" move.l %0,%%d0" :: "i"(DRAM_START));
  83. asm(" movec.l %d0,%vbr");
  84. asm(" move.l %0,%%sp" :: "m"(*(int *)DRAM_START));
  85. asm(" move.l %0,%%a0" :: "m"(*(int *)(DRAM_START+4)));
  86. asm(" jmp (%a0)");
  87. }
  88.  
  89. void shutdown(void)
  90. {
  91. printf("Shutting down...");
  92.  
  93. /* We need to gracefully spin down the disk to prevent clicks. */
  94. if (ide_powered())
  95. {
  96. /* Make sure ATA has been initialized. */
  97. storage_init();
  98.  
  99. /* And put the disk into sleep immediately. */
  100. storage_sleepnow();
  101. }
  102.  
  103. sleep(HZ*2);
  104.  
  105. backlight_hw_off();
  106. //remote_backlight_hw_off();
  107.  
  108. __reset_cookie();
  109. power_off();
  110. }
  111.  
  112. /* Print the battery voltage (and a warning message). */
  113. void check_battery(void)
  114. {
  115. int battery_voltage, batt_int, batt_frac;
  116.  
  117. battery_voltage = _battery_voltage();
  118. batt_int = battery_voltage / 1000;
  119. batt_frac = (battery_voltage % 1000) / 10;
  120.  
  121. printf("Batt: %d.%02dV", batt_int, batt_frac);
  122.  
  123. if (battery_voltage <= 310)
  124. {
  125. printf("WARNING! BATTERY LOW!!");
  126. sleep(HZ*2);
  127. }
  128. }
  129.  
  130. /* From the pcf50606 driver */
  131. extern unsigned char pcf50606_intregs[3];
  132.  
  133. /* From common.c */
  134. extern int line;
  135. extern int remote_line;
  136.  
  137. void main(void)
  138. {
  139. int i;
  140. int rc;
  141. bool rc_on_button = false;
  142. bool on_button = false;
  143. bool rec_button = false;
  144. bool hold_status = false;
  145. int data;
  146. bool rtc_alarm;
  147. int button;
  148. int mask;
  149.  
  150. /* We want to read the buttons as early as possible, before the user
  151. releases the ON button */
  152.  
  153. /* Set GPIO33, GPIO37, GPIO38 and GPIO52 as general purpose inputs
  154. (The ON and Hold buttons on the main unit and the remote) */
  155. or_l(0x00100062, &GPIO1_FUNCTION);
  156. and_l(~0x00100062, &GPIO1_ENABLE);
  157.  
  158. data = GPIO1_READ;
  159. if ((data & 0x20) == 0)
  160. on_button = true;
  161.  
  162. if ((data & 0x40) == 0)
  163. rc_on_button = true;
  164.  
  165. /* Set the default state of the hard drive power to OFF */
  166. ide_power_enable(false);
  167.  
  168. power_init();
  169.  
  170. /* Check the interrupt registers if it was an RTC alarm */
  171. rtc_alarm = (pcf50606_intregs[0] & 0x80)?true:false;
  172.  
  173. /* Turn off if we believe the start was accidental */
  174. if(!(rtc_alarm || on_button || rc_on_button ||
  175. (usb_detect() == USB_INSERTED) || charger_inserted())) {
  176. __reset_cookie();
  177. power_off();
  178. }
  179.  
  180. /* get rid of a nasty humming sound during boot */
  181. mask = disable_irq_save();
  182. pcf50606_write(0x3b, 0x00); /* GPOOD2 high Z */
  183. pcf50606_write(0x3b, 0x07); /* GPOOD2 low */
  184. restore_irq(mask);
  185.  
  186. /* Start with the main backlight OFF. */
  187. backlight_hw_init();
  188. backlight_hw_off();
  189.  
  190. //remote_backlight_hw_on();
  191.  
  192. system_init();
  193. kernel_init();
  194.  
  195. /* Set up waitstates for the peripherals */
  196. set_cpu_frequency(0); /* PLL off */
  197. coldfire_set_pllcr_audio_bits(DEFAULT_PLLCR_AUDIO_BITS);
  198. enable_irq();
  199.  
  200. isp1362_init();
  201.  
  202. adc_init();
  203. button_init();
  204.  
  205. backlight_init();
  206.  
  207. lcd_init();
  208. //lcd_remote_init();
  209. font_init();
  210.  
  211. lcd_setfont(FONT_SYSFIXED);
  212.  
  213. printf("Rockbox boot loader");
  214. printf("Version %s", rbversion);
  215.  
  216. sleep(HZ/50); /* Allow the button driver to check the buttons */
  217. rec_button = ((button_status() & BUTTON_REC) == BUTTON_REC)
  218. || ((button_status() & BUTTON_RC_REC) == BUTTON_RC_REC);
  219.  
  220. check_battery();
  221.  
  222. if(rtc_alarm)
  223. printf("RTC alarm detected");
  224.  
  225. /* Don't start if the Hold button is active on the device you
  226. are starting with */
  227. if ((on_button && button_hold()) ||
  228. (rc_on_button && remote_button_hold()))
  229. {
  230. hold_status = true;
  231. }
  232. if (hold_status && !rtc_alarm && (usb_detect() != USB_INSERTED) &&
  233. !charger_inserted())
  234. {
  235. if (detect_original_firmware())
  236. {
  237. printf("Hold switch on");
  238. shutdown();
  239. }
  240. }
  241.  
  242. /* Holding REC while starting runs the original firmware */
  243. if (detect_original_firmware() && rec_button)
  244. {
  245. printf("Starting original firmware...");
  246. start_iriver_fw();
  247. }
  248.  
  249. if(charger_inserted())
  250. {
  251. const char charging_msg[] = "Charging...";
  252. const char complete_msg[] = "Charging complete";
  253. const char *msg;
  254. int w, h;
  255. bool blink_toggle = false;
  256. bool request_start = false;
  257.  
  258. cpu_idle_mode(true);
  259.  
  260. while(charger_inserted() && !request_start)
  261. {
  262. button = button_get_w_tmo(HZ);
  263.  
  264. switch(button)
  265. {
  266. case BUTTON_ON:
  267. request_start = true;
  268. break;
  269.  
  270. case BUTTON_NONE: /* Timeout */
  271.  
  272. if(charging_state())
  273. {
  274. /* To be replaced with a nice animation */
  275. blink_toggle = !blink_toggle;
  276. msg = charging_msg;
  277. }
  278. else
  279. {
  280. blink_toggle = true;
  281. msg = complete_msg;
  282. }
  283.  
  284. font_getstringsize(msg, &w, &h, FONT_SYSFIXED);
  285. reset_screen();
  286. if(blink_toggle)
  287. lcd_putsxy((LCD_WIDTH-w)/2, (LCD_HEIGHT-h)/2, msg);
  288.  
  289. check_battery();
  290. break;
  291. }
  292.  
  293. if(usb_detect() == USB_INSERTED)
  294. request_start = true;
  295. }
  296. if(!request_start)
  297. {
  298. __reset_cookie();
  299. power_off();
  300. }
  301.  
  302. cpu_idle_mode(false);
  303. }
  304.  
  305. usb_init();
  306.  
  307. /* A hack to enter USB mode without using the USB thread */
  308. if(usb_detect() == USB_INSERTED)
  309. {
  310. const char msg[] = "Bootloader USB mode";
  311. int w, h;
  312. font_getstringsize(msg, &w, &h, FONT_SYSFIXED);
  313. reset_screen();
  314. lcd_putsxy((LCD_WIDTH-w)/2, (LCD_HEIGHT-h)/2, msg);
  315. lcd_update();
  316.  
  317. //lcd_remote_puts(0, 3, msg);
  318. //lcd_remote_update();
  319.  
  320. ide_power_enable(true);
  321. storage_enable(false);
  322. sleep(HZ/20);
  323. usb_enable(true);
  324. cpu_idle_mode(true);
  325. while (usb_detect() == USB_INSERTED)
  326. {
  327. /* Print the battery status. */
  328. line = 0;
  329. remote_line = 0;
  330. check_battery();
  331.  
  332. storage_spin(); /* Prevent the drive from spinning down */
  333. sleep(HZ);
  334. }
  335.  
  336. cpu_idle_mode(false);
  337. usb_enable(false);
  338.  
  339. reset_screen();
  340. lcd_update();
  341. }
  342.  
  343. rc = storage_init();
  344. if(rc)
  345. {
  346. reset_screen();
  347. printf("ATA error: %d", rc);
  348. printf("Insert USB cable and press");
  349. printf("a button");
  350. while(!(button_get(true) & BUTTON_REL));
  351. }
  352.  
  353. filesystem_init();
  354.  
  355. rc = disk_mount_all();
  356. if (rc<=0)
  357. {
  358. reset_screen();
  359. printf("No partition found");
  360. while(button_get(true) != SYS_USB_CONNECTED) {};
  361. }
  362.  
  363. printf("Loading firmware");
  364. i = load_firmware((unsigned char *)DRAM_START, BOOTFILE, MAX_LOADSIZE);
  365. if(i <= EFILE_EMPTY)
  366. printf("Error: %s", loader_strerror(i));
  367.  
  368. if (i > 0)
  369. start_firmware();
  370.  
  371. if (!detect_original_firmware())
  372. {
  373. printf("No firmware found on disk");
  374. sleep(HZ*2);
  375. shutdown();
  376. }
  377. else {
  378. sleep(HZ*2);
  379. start_iriver_fw();
  380. }
  381. }
  382.  
  383. /* These functions are present in the firmware library, but we reimplement
  384. them here because the originals do a lot more than we want */
  385. void screen_dump(void)
  386. {
  387. }
  388.  
  389. int usb_screen(void)
  390. {
  391. return 0;
  392. }
  393.  
  394. unsigned short *bidi_l2v(const unsigned char *str, int orientation)
  395. {
  396. static unsigned short utf16_buf[SCROLL_LINE_SIZE];
  397. unsigned short *target;
  398. (void)orientation;
  399.  
  400. target = utf16_buf;
  401.  
  402. while (*str)
  403. str = utf8decode(str, target++);
  404. *target = 0;
  405. return utf16_buf;
  406. }
  407.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement