at the lowest level, SCSI/IDE/SATA all shared a common command base (perhaps with variations) - which is ATA command (because in drivers/ata/*.c u can find the symbol ATA_XXX_CMD in all the three different hardware architecture):<div>
<br></div><div>Below is a an example specified by standard body (these command are OS agnostic):</div><div><br></div><div><a href="https://github.com/gcastigl/SO2C2011TP2/blob/master/doc/ATA%20-%20ATAPI%20Command%20Set.pdf">https://github.com/gcastigl/SO2C2011TP2/blob/master/doc/ATA%20-%20ATAPI%20Command%20Set.pdf</a><br>
<br>Look at all the &quot;ATA_CMD_*&quot; command here:</div><div><br><a href="https://github.com/Scorpiion/Renux_u-boot/blob/master/include/ata.h">https://github.com/Scorpiion/Renux_u-boot/blob/master/include/ata.h</a><br>
<br></div><div>So the drivers just literally concatenate these command into a string and send it over to the device.</div><div><br></div><div>for example in drivers/ata/libata-core.c:</div><div><br></div><div><div>static int ata_read_native_max_address(struct ata_device *dev, u64 *max_sectors)</div>
<div>{</div><div>        unsigned int err_mask;</div><div>        struct ata_taskfile tf;</div><div>        int lba48 = ata_id_has_lba48(dev-&gt;id);</div><div><br></div><div>        ata_tf_init(dev, &amp;tf);</div><div><br>
</div><div>        /* always clear all address registers */</div><div>        tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;</div><div><br></div><div>        if (lba48) {</div><div>                tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;</div>
<div>                tf.flags |= ATA_TFLAG_LBA48;</div><div>        } else</div><div>                tf.command = ATA_CMD_READ_NATIVE_MAX;</div><div><br></div><div>the tf.command data within is ultimately send by port I/O operation.   BUT.....not sure of details, corrections welcome :-).</div>
<div><br></div><div>On Thu, Feb 7, 2013 at 4:19 PM, horseriver <span dir="ltr">&lt;<a href="mailto:horserivers@gmail.com" target="_blank">horserivers@gmail.com</a>&gt;</span> wrote:</div></div><div><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">hi:)<br>
<br>
   I am curious about how hd controller work .<br>
   When user am reaing/writing hd ,it was implemented by sending command<br>
   to hd controller&#39;s special port.Then ,how does the controller know<br>
   a new command has received?<br>
<br>
   In this procedure , what work does the hd driver do ?<br>
<br>
thanks!<br>
<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh
</div>