| .. SPDX-License-Identifier: GPL-2.0+ |
| |
| Configuration Editor |
| ==================== |
| |
| Introduction |
| ------------ |
| |
| U-Boot provides a configuration editor which allows settings to be changed in |
| a GUI or text environment. |
| |
| |
| This feature is still in development and has a number of limitations. For |
| example, cedit only supports menu items (there is no numeric or text entry), |
| provides no support for colour text and does not support scrolling. Still it is |
| possible to use it for simple applications. |
| |
| |
| Overview |
| -------- |
| |
| The configuration editor makes use of :doc:`expo` to build a description of the |
| configuration screens and allow user to interact with it. |
| |
| To create a single-scene cedit for your application: |
| |
| #. Design the scene, i.e. the objects that need to be present and what their |
| possible values are |
| |
| #. Enter this in .dts format |
| |
| #. Create a header file containing the IDs |
| |
| #. Run the 'expo.py' tool to generate a .dtb file containing the layout, which |
| can be used by U-Boot |
| |
| #. Use the :doc:`../usage/cmd/cedit` to create the cedit, read the settings, |
| present the cedit to the user and save the settings afterwards. |
| |
| Each of these is described in a separate section. See :ref:`expo_example` for |
| an example file. |
| |
| |
| Design a scene |
| -------------- |
| |
| Using a piece of paper or a drawing tool, lay out the objects you want in your |
| scene. Typically you will use the default layout engine, which simply puts items |
| one after the other from top to bottom. So use a single column and show the |
| prompt and value for each object. |
| |
| For menu items, show one of the values, but keep in mind what else you need. |
| |
| |
| Create an expo-format file |
| -------------------------- |
| |
| The description is in the form of a devicetree file, as documented at |
| :ref:`expo_format`. Since everything in an expo has an ID number (an integer |
| greater than 1) the description is written terms of these IDs. They each have |
| an enum value. which is typically taken care of by the `expo.py` tool. |
| |
| The expo should have a `scenes` node with a named scene as a subnode. Within the |
| scene, add properties for the scene, then a subnode for each object in the |
| scene. |
| |
| All object nodes require an `id` value and a `type` property. Other properties |
| depend on the type. For example, a menu has a `title` and an `item-label` list |
| proving the text for the menu items, as well as an `item-id` list providing the |
| ID of each menu item, so it can be selected. |
| |
| Text properties may have two variants. For example `title` specifies the title |
| of a menu, but you can instead use `title-id` to specify the string ID to use as |
| the title. String are defined in a separate area, common to the whole expo, |
| which contains a subnode for each string. Within that subnode are the ID and the |
| `value` (i.e. the text). For now only English is supported, but in future it may |
| be possible to append a language identifier to provide other values (e.g. |
| 'value-es' for Spanish). |
| |
| |
| Create an ID header-file |
| ------------------------ |
| |
| Expo needs to know the integer value to use for every ID referenced in your |
| expo-format file. For example, if you have defined a `cpu-speed` node with an |
| id of `ID_CPU_SPEED`, then Expo needs to know the value of `ID_CPU_SPEED`. |
| |
| When you write C code to use the expo, you may need to know the IDs. For |
| example, to find which value the user selected in `cpu-speed` menu, you must |
| use the `ID_CPU_SPEED` ID. The ID is the only way to refer to anything in Expo. |
| |
| Since we need a shared set of IDs, it is best to have a header file containing |
| them. Expo supports doing this with an enum, where every ID is listed in the |
| enum:: |
| |
| enum { |
| ID_PROMPT = EXPOID_BASE_ID, |
| |
| ID_PROMPT, |
| |
| ID_SCENE1, |
| ID_SCENE1_TITLE, |
| ... |
| }; |
| |
| The C compiler can parse this directly. The `expo.py` tool parses it for expo. |
| |
| Create a header file containing every ID mentioned in your expo. Try to group |
| related things together. |
| |
| |
| Build the expo layout |
| --------------------- |
| |
| Use the `expo.py` tool to build a .dtb for your expo:: |
| |
| ./tools/expo.py -e expo_ids.h -l expo_layout.dts -o expo.dtb |
| |
| This uses the enum in the provided header file to get the ID numbers, grabs |
| the `.dts` file, inserts the ID numbers and then uses the devicetree compiler to |
| build a `.dtb` file. |
| |
| If you get an error:: |
| |
| Devicetree compiler error: |
| Error: <stdin>:9.19-20 syntax error |
| FATAL ERROR: Unable to parse input tree |
| |
| that means that something is wrong with your syntax, or perhaps you have an ID |
| in the `.dts` file that is not mentioned in your enum. Check both files and try |
| again. |
| |
| Note that the first ID in your file must be no less that `EXPOID_BASE_ID` since |
| IDs before that are reserved. The `expo.py` tool automatically obtains this |
| value from the `expo.h` header file, but you must set the first ID to this |
| enum value. |
| |
| |
| Use the command interface |
| ------------------------- |
| |
| See the :doc:`../usage/cmd/cedit` command for information on available commands. |
| Typically you will use `cedit load` to load the `.dtb` file and `cedit run` to |
| let the user interact with it. |
| |
| |
| Multiple scenes |
| --------------- |
| |
| Expo supports multiple scenes but has no pre-determined way of moving between |
| them. You could use selection of a menu item as a signal to change the scene, |
| but this is not currently implemented in the cedit code (see `cedit_run()`). |
| |
| |
| Themes |
| ------ |
| |
| The configuration editor uses simple expo themes. The theme is read from |
| `/bootstd/cedit-theme` in the devicetree. |
| |
| |
| Reading and writing settings |
| ---------------------------- |
| |
| Cedit provides several options for persistent settings: |
| |
| - Writing an FDT file to a filesystem |
| - Writing to U-Boot's environment variables, which are then typically stored in |
| a persistent manner |
| - Writing to CMOS RAM registers (common on x86 machines). Note that textline |
| objects do not appear in CMOS RAM registers |
| |
| For now, reading and writing settings is not automatic. See the |
| :doc:`../usage/cmd/cedit` for how to do this on the command line or in a |
| script. For x86 devices, see :ref:`cedit_cb_load`. |