| |
| When porting from old barebox the follwing steps must be taken (please complain |
| if there's something missing here ;) |
| |
| |
| - Most of the macros in include/configs/yourboard.h can be removed, especially |
| the CONFIG_COMMANDS section. The goal is to remove this file entirely, but |
| for now some values are still needed here. If you think some things are better |
| configured with the Kconfig system feel free to add them there. |
| |
| - The linker script needs a new section for the initcalls. The handling of the |
| barebox command table has changed, too. (The commands are now sorted by the |
| linker instead at runtime.) To change it you need an entry like the following |
| in your linker script: |
| |
| #include <asm-generic/barebox.lds.h> |
| |
| __barebox_cmd_start = .; |
| .barebox_cmd : { BAREBOX_CMDS } |
| __barebox_cmd_end = .; |
| |
| __barebox_initcalls_start = .; |
| .barebox_initcalls : { INITCALLS } |
| __barebox_initcalls_end = .; |
| |
| - Rename your linker script to barebox.lds.S and add the following entry to the |
| Makefile to make sure the linker script is generated: |
| |
| extra-y += barebox.lds |
| |
| - Register the devices present in your system in the board specific .c file. |
| To see anything you have to at least register a console. In scb9328.c this |
| looks like this: |
| |
| static struct device_d scb9328_serial_device = { |
| .name = "imx_serial", |
| .map_base = IMX_UART1_BASE, |
| .size = 4096, |
| }; |
| |
| static int scb9328_console_init(void) |
| { |
| register_device(&scb9328_serial_device); |
| return 0; |
| } |
| |
| console_initcall(scb9328_console_init); |
| |
| - For most boards you will have to register a cfi_flash device. NAND flash |
| is not ported yet. |
| |
| - Call devfs_add_partition() to add an environment partition for your device: |
| devfs_add_partition("nor0", 0x40000, 0x20000, "env0"); |
| This will add an area starting at 0x40000 of size 0x20000 of the device |
| nor0 as env0. |
| |
| - Port missing drivers. Depending on the driver this can a be rather simple |
| process: |
| |
| Serial drivers |
| - Declare all functions static. |
| - in your probe function fill in a struct console_device and register it |
| with console_register() |
| |
| Ethernet drivers |
| - Basically do the same as with serial drivers. |
| - Identify the parts of the driver which handle the MAC address. There are |
| now two functions handling them in struct eth_device. |
| |
| get_mac_address() retrieve the MAC address from the EEPROM if one is |
| connected. If you don't have an EEPROM just return -1. |
| set_mac_address() set the MAC address in the device. All magic previously |
| done with getenv/setenv(ethaddr) must be removed. |
| |
| During startup barebox calls get_mac_address() to see if an EEPROM is |
| connected. If so, it calls set_mac_address() with this address. This |
| is done even if networking is not used during startup. This makes sure |
| that the MAC address is set in the device and Linux can pick it up later. |
| - There is now (the beginning of) generic phy support. When porting drivers |
| it is recommended to use it. The phy support currently only starts generic |
| autonegotiation, so if you have some fancy things to do (or have gigabit |
| ethernet) you'll have to extend the phy layer first. Although this is |
| extra work, it will pay off some day, as phy support is a great source |
| of duplicated code. see drivers/net/dm9000.c or drivers/net/fec_mpc5200.c |
| for examples. |
| |
| - Add a clocksource for your system. PowerPCs have a generic decrementer |
| counter, so if you have a PowerPC you have nothing to do here. On ARM |
| this is SoC dependent. See Documentation/timekeeping.txt for further |
| information. |
| |
| - Adjust start.S. On PowerPC there is at least the Problem that the relocation |
| offset is defined at compile time. It is easily possible to determine the |
| address barebox is currently starting from at runtime and thus allowing it |
| barebox to be started at any address. Look at the relocation code and replace |
| TEXT_BASE with the following calculation of the runtime address: |
| |
| bl calc_source /* Calculate Source Address */ |
| calc_source: |
| mfspr r4, LR |
| subi r4, r4, (calc_source - _start) |
| subi r4, r4, 0x100 |
| |
| (I'm almost sure that PowerPC has a dedicated instruction for this, un- |
| fortunately I know next to nothing of PowerPC assembler, so if you have |
| a better way to archieve this, please write to the list.) |
| |
| On PowerPC barebox now runs at the address it was linked to, so you have |
| to adjust TEXT_BASE to be in RAM. This makes the various fixup relocation |
| functions unnecessary. On PowerPC the removal of -fPIC saves around 10% of |
| binary space. It also simplifies debugging because you will see the correct |
| addresses in the objdump without doing offset calculation. |
| |
| - On ARM most of the duplicate code under cpu/arm* is already merged into |
| arch/arm/cpu. The start.S files are missing though. |