Olhando para as diferenças de firmware do dispositivo versus driver, não vejo por que tecnicamente precisamos da distinção. Eu entendo que o firmware não é fácil de mudar, que assume a operação de dispositivo de baixo nível enquanto os drivers estão lá para se comunicar com o sistema operacional host.
A questão é: por que não podemos simplesmente recolher essas duas camadas em uma só? Apenas um driver que sabe como se comunicar com o sistema operacional e traduz todas as solicitações diretamente para operações de dispositivo de baixo nível. É para facilitar o desenvolvimento (ou seja, reduzir o conhecimento do desenvolvedor necessário para desenvolver este software)? Não é possível se comunicar com o dispositivo usando um software que não reside em sua memória flash?
Não, ambos os tipos de software geralmente são executados em um tipo diferente de máquina.
O firmware está sendo executado no processador/controlador do dispositivo periférico, o driver está sendo executado na CPU da sua máquina. Esses geralmente são de tipos diferentes.
Em teoria, pode- se encarregar a CPU de sua máquina de fazer todo o bit-banging no dispositivo periférico. Isso foi feito nos primeiros computadores. Mas isso tem um preço alto.
Freqüentemente, o protocolo externo envolve restrições rígidas de tempo (pense em uma placa de rede ou em um monitor CRT). Sua CPU precisará lidar com muitas interrupções para fazer o trabalho no momento certo. Por esse motivo, no famoso Sinclair ZX-81, a tela apagava quando a CPU estava trabalhando duro - sem tempo para atualizar a tela :)
Assim, tentamos desacoplar o trabalho dos dispositivos periféricos na atualidade. A CPU será notificada quando um pacote de rede completo chegar e não precisará pesquisar um fio para alterar os bits.
O firmware é executado no dispositivo usando o hardware do dispositivo diretamente. Uma maneira de ver isso é que o firmware é uma API para o sistema operacional, não importa qual sistema operacional o computador execute, se ele receber a instrução x, o firmware fará y e poderá retornar um valor z. O dispositivo terá seu próprio relógio que controlará as instruções de velocidade executadas, sua própria memória e o processador do dispositivo pode ser diferente do computador, por exemplo, o computador pode ser um amd64, mas o dispositivo possui um processador arm64. O firmware não se comunica diretamente com a CPU ou RAM, ele recebe instruções do barramento e coloca os dados de volta no barramento.
Os drivers são executados no computador no nível do kernel do sistema operacional ou no nível do usuário do sistema operacional, um driver depende do sistema operacional e deve atender aos requisitos do sistema operacional para poder funcionar. Um driver geralmente lidará com qualquer trabalho que precise da CPU e/ou da RAM do computador, uma vez que o processamento da instrução foi concluído, a instrução é passada para o dispositivo por meio do firmware.
Na verdade, eles não precisam ser separados.
Em muitos casos, pode-se percorrer todo o espectro, desde o controle do hardware diretamente da CPU central até a implementação o máximo possível no firmware.
Aqui está uma lista incompleta de considerações de design sobre equilíbrio firmware/driver:
Claro, pode-se criar um stick de memória flash USB que exponha a semântica NAND ao driver e salve o chip controlador. E distribua seu driver exótico de alguma forma (para impressoras Windows, Linux, MAC, Konica, etc, etc...). Por outro lado, usuários e desenvolvedores de sistemas operacionais esperam que o stick USB funcione com o driver de dispositivo de bloco padrão. Mouse óptico com interface não HID? Também não é uma boa ideia.
O driver (mesmo se compilado) está disponível para fácil engenharia reversa e alteração, o firmware - muito menos. Este é frequentemente o caso com chips de vídeo.
Muitos firmwares relacionados a rádio (wifi, celular, bluetooth) reforçam a conformidade com os regulamentos de espectro de frequência.
etc etc...
Além disso, existem alguns dispositivos que não possuem memória ROM, portanto, o firmware é, na verdade, parte do driver e é carregado no dispositivo a cada inicialização.