Firmware = embedded software for a microcontroller inside a chip.
I would put this as essential:
- Processor architecture knowledge, instruction set (simulator) and assembler basic knowledge.
- For low level, assembler or C/C++ code with compiler/linker/debug experience.
- Interrupts (levels, number of interrupts, masking).
- Memory types, ROM, (S)RAM, EEPROM, flash, DDR, … . Internal or external.
I would put this as more experienced firmware requirements:
- Higher level coding: C/C++, HAL (hardware abstraction layer) or even an OS.
- IC and PCB knowledge, slew rate, crystals (and clock pins), IO pin config (high impedant state), supply voltages (and caps), … .
- Debugging with JTAG or other protocol. Using breakpoints, evaluating internals (memory, registers), … . Using GPIO’s for example to control LEDs for certain status or fail conditions.
- Digital, analog scope experience. Protocol debuggers or monitors (UART, I2C, I2S, SPI, USB, ethernet, …). Triggering, data capture.
- Boot modes, bootloaders, update or bug fixing (in the field) updating.
- Scripting to fast process logfiles, convert data, post- and pre-processing.
- SSH, telnet, network TCP/IP protocol for advanced network connected devices. Wifi, bluetooth could also be interesting since they are widely used in a lot of systems.
As you can see, there are very simple, small controllers with almost no capabilities to very complex multi-processor systems with many protocols and connections. And, depending on the sector, there are other things to consider. Compliance for safety, reliability, EMC, … .