Bagikan melalui


Permintaan Digital Aman yang Menggunakan I/O Langsung

Contoh kode berikut menggambarkan bagaimana driver menggunakan permintaan perintah untuk mengambil konten register dasar fungsi perangkat (FBR). Karena jumlah data yang diambil kecil, contohnya menggunakan perintah I/O langsung (disebut CMD52 dalam spesifikasi SD), yang menginstruksikan pengemudi bus untuk mengirimkan data di seluruh baris CMD. Untuk melihat contoh kode yang menggambarkan cara menggunakan I/O yang diperluas (disebut CMD53 dalam spesifikasi SD), lihat Permintaan Digital Aman yang Menggunakan I/O Yang Diperluas.

    const SDCMD_DESCRIPTOR ReadIoDirectDesc =
    {SDCMD_IO_RW_DIRECT, SDCC_STANDARD, SDTD_READ,
    SDTT_CMD_ONLY, SDRT_5};
    
    PSDBUS_REQUEST_PACKET sdrp = NULL;
    SD_RW_DIRECT_ARGUMENT sdIoArgument;
    
    sdrp = ExAllocatePool(NonPagedPool, 
        sizeof(SDBUS_REQUEST_PACKET));
    if (!sdrp) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    RtlZeroMemory(sdrp, sizeof(SDBUS_REQUEST_PACKET));
    sdrp->RequestFunction = SDRF_DEVICE_COMMAND;
    sdrp->Parameters.DeviceCommand.CmdDesc = ReadIoDirectDesc;
    
    // Set up the argument and command descriptor
    
    sdIoArgument.u.AsULONG = 0;
    sdIoArgument.u.bits.Address = Offset;
    
    // Function # must be initialized by SdBus GetProperty call
    
    sdIoArgument.u.bits.Function = pDevExt->FunctionNumber;
    sdrp->Parameters.DeviceCommand.Argument = sdIoArgument.u.AsULONG;
    
    // Submit the request
    
    status = SdBusSubmitRequest(pDevExt->BusInterface.Context, sdrp);
    
    if (NT_SUCCESS(status)) {
        // for direct I/O, the data comes in the response
        *Data = sdrp->ResponseData.AsUCHAR[0];
    }
    ExFreePool(sdrp);

Untuk membaca FBR, contoh kode melakukan langkah-langkah berikut:

  1. Menginisialisasi Deskriptor

    Langkah pertama dalam mengirim permintaan perintah perangkat adalah menentukan deskriptor perintah SD, SDCMD_DESCRIPTOR. Biasanya, deskriptor didefinisikan sebagai struktur data konstan. Deskriptor dalam contoh kode menentukan operasi baca dengan elemen berikut:

    Elemen Deskripsi

    SD_COMMAND_CODE

    Operasi yang ditentukan oleh deskriptor membaca satu byte data dari FBR, sehingga contoh kode menggunakan perintah I/O langsung (CMD52), yang menginstruksikan kartu untuk melaporkan data yang diminta di seluruh baris CMD dan bukan baris DAT. Contoh kode menunjukkan perintah I/O langsung dengan menetapkan nilai SDCMD_IO_RW_DIRECT kepada anggota ini.

    SD_COMMAND_CLASS

    Operasi baca milik set perintah standar (kode perintah 0 hingga 63), sehingga nilai yang ditetapkan untuk anggota deskriptor ini SDCC_STANDARD.

    SD_TRANSFER_DIRECTION

    Operasi baca memerlukan transfer dari perangkat ke host, sehingga nilai yang ditetapkan untuk anggota deskriptor ini SDTD_READ.

    SD_TRANSFER_TYPE

    Operasi ini membaca sejumlah kecil data dari register melalui baris CMD. Kartu tidak harus mengirim data melalui baris DAT, oleh karena itu, anggota ini diberi nilai SDTT_CMD_ONLY.

    SD_RESPONSE_TYPE

    Deskriptor menentukan jenis respons SDRT_5, yang berarti bahwa kartu harus memberi tahu host bahwa operasi telah selesai dengan permintaan interupsi. Untuk penjelasan tentang respons R5, lihat spesifikasi Asosiasi Kartu MultiMedia .

  2. Inisialisasi Paket Permintaan dengan menyelesaikan langkah-langkah berikut:

    1. Tentukan Fungsi Permintaan:

      Setelah membuat deskriptor SD, contoh kode menginisialisasi paket permintaan, SDBUS_REQUEST_PACKET. Anggota RequestFunction dari paket permintaan menentukan apakah permintaan berisi perintah perangkat (nilai SDRF_DEVICE_COMMAND) atau operasi properti (nilai SDRF_GET_PROPERTY atau SDRF_SET_PROPERTY). Contoh kode memulai perintah perangkat, sehingga mengatur anggota RequestFunction ke SDRF_DEVICE_COMMAND.

    2. Muat Deskriptor Perintah: Selanjutnya, contoh kode menyimpan deskriptor yang baru diinisialisasi di anggota Parameters.DeviceCommand.CmdDesc dari paket permintaan.

    3. Menginisialisasi Argumen Baca/Tulis:

      Paket permintaan berisi struktur SD_RW_DIRECT_ARGUMENT yang menyimpan lokasi data yang diambil pengemudi bus. Struktur ini juga menyimpan jumlah fungsi yang ruang I/O-nya dari mana pengemudi bus membaca. Kode contoh mengambil nomor fungsi dari ekstensi perangkat, yang menyiratkan bahwa driver sebelumnya mengambil informasi dari kartu (mungkin ketika memulai perangkat) dengan permintaan SDRF_GET_PROPERTY dan menyimpannya di ekstensi perangkat.

  3. Mengirimkan Permintaan

    Setelah menginisialisasi deskriptor dan paket permintaan, contoh kode menggunakan rutinitas permintaan sinkron, SdBusSubmitRequest, untuk mengirimkan permintaan. Rutinitas permintaan diteruskan dalam paket permintaan dan informasi konteks antarmuka yang diberikan sistem kepada driver saat membuka antarmuka SD. Karena ini adalah permintaan sinkron, driver harus berjalan di IRQL kurang dari DISPATCH_LEVEL.

  4. Hasil Perintah

    Karena contoh kode menggunakan I/O langsung, tidak ada buffer data yang diperlukan selain bidang ResponseData dalam paket permintaan SD.