Manipulando interrupções de cartão SD
Os drivers de cartão SD (Secure Digital) não têm ISRs (rotinas de serviço de interrupção) e não adquirem recursos de IRQ (solicitação de interrupção). O driver de barramento SD detecta e intercepta interrupções de hardware e, em seguida, relata-as ao driver do dispositivo por meio da rotina de retorno de chamada de notificação de interrupção PSDBUS_CALLBACK_ROUTINE, conforme explicado nas seções Pilha de Driver SD (Secure Digital) e Abertura e Inicialização de uma Interface de Barramento SD.
O driver do dispositivo não precisa concluir o processamento de interrupção no contexto da rotina de retorno de chamada de notificação de interrupção. O driver pode retornar da rotina de retorno de chamada e concluir o processamento de interrupção em seu próprio contexto. Quando o driver termina de processar a interrupção, ele informa o motorista do ônibus por uma chamada explícita para uma rotina de confirmação de interrupção fornecida com a interface do barramento SD. Para obter mais informações sobre a rotina de confirmação de interrupção, consulte PSDBUS_ACKNOWLEDGE_INT_ROUTINE. Quando o motorista do ônibus recebe essa chamada, ele reabilita a interrupção.
Os drivers de dispositivo SD têm duas opções em relação aos IRQLs (níveis IRQ) em que são executados. Um driver SD pode ser executado exclusivamente em PASSIVE_LEVEL ou pode ser executado em DISPATCH_LEVEL enquanto estiver no contexto da rotina de retorno de chamada de notificação de interrupção e em PASSIVE_LEVEL o resto do tempo. Quando um driver de dispositivo SD é executado exclusivamente em PASSIVE_LEVEL, o motorista do ônibus assume a responsabilidade por sincronizar interrupções. Escolha essa opção se o dispositivo puder operar sem limites rígidos de latência de interrupção, pois simplificará o design do driver. Além de descarregar a tarefa de sincronização de interrupção no motorista do ônibus, há outros benefícios. Por exemplo, os drivers devem transferir dados com frequência em resposta a uma interrupção. Se a rotina de retorno de chamada do driver estiver em execução no PASSIVE_LEVEL, será livre para executar uma operação de E/S síncrona em vez de assíncrona. Se a rotina de retorno de chamada for executada em DISPATCH_LEVEL, o driver deverá aguardar até que ele esteja em execução em um IRQL inferior antes de fazer E/S síncrona.
Um driver de dispositivo SD especifica o IRQL no qual ele será executado quando inicializar a interface do barramento SD. Para ser executado em DISPATCH_LEVEL na rotina de retorno de chamada de notificação de interrupção, o driver deve definir o membro CallbackAtDpcLevel da estrutura SDBUS_INTERFACE_PARAMETERS como TRUE e passar essa estrutura para a rotina de inicialização da interface. Para obter uma descrição da rotina de interface, consulte PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Para ser executado exclusivamente em PASSIVE_LEVEL, o driver deve definir CallbackAtDpcLevel como FALSE.