esp32-s2_dfu/0.4/group___m_s_c___host.html

664 lines
36 KiB
HTML

<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>tinyusb: Host</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table width="100%" cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">tinyusb
&#160;<span id="projectnumber">0.4</span>
</div>
</td>
<td align="right">
<a href="https://pledgie.com/campaigns/24694"><img border="0" src="https://pledgie.com/campaigns/24694.png?skin_name=chrome" alt="Click here to lend your support to tinyusb donation and make a donation at pledgie.com"></a>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('group___m_s_c___host.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Pages</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Host<div class="ingroups"><a class="el" href="group___class_driver___m_s_c.html">MassStorage (MSC)</a></div></div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:gaf823d310e293579f62f7c78888980619"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gaf823d310e293579f62f7c78888980619">tusbh_msc_is_mounted</a> (uint8_t dev_addr) <a class="el" href="group___group___func_attr.html#ga477faefde32bfd89d5b5b40d70b1a998">ATTR_PURE</a> <a class="el" href="group___group___func_attr.html#gaa61f3d1a169c3d97d95072b1ee6493fd">ATTR_WARN_UNUSED_RESULT</a></td></tr>
<tr class="memdesc:gaf823d310e293579f62f7c78888980619"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check if device supports MassStorage interface or not. <a href="#gaf823d310e293579f62f7c78888980619">More...</a><br/></td></tr>
<tr class="separator:gaf823d310e293579f62f7c78888980619"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa6cc5099b9bb874fb13e6e2e4fd1b4fc"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gaa6cc5099b9bb874fb13e6e2e4fd1b4fc">tusbh_msc_is_busy</a> (uint8_t dev_addr) <a class="el" href="group___group___func_attr.html#ga477faefde32bfd89d5b5b40d70b1a998">ATTR_PURE</a> <a class="el" href="group___group___func_attr.html#gaa61f3d1a169c3d97d95072b1ee6493fd">ATTR_WARN_UNUSED_RESULT</a></td></tr>
<tr class="memdesc:gaa6cc5099b9bb874fb13e6e2e4fd1b4fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check if the interface is currently busy or not. <a href="#gaa6cc5099b9bb874fb13e6e2e4fd1b4fc">More...</a><br/></td></tr>
<tr class="separator:gaa6cc5099b9bb874fb13e6e2e4fd1b4fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4e5db3391a76dfa58c0b8d257de8a66b"><td class="memItemLeft" align="right" valign="top">uint8_t const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#ga4e5db3391a76dfa58c0b8d257de8a66b">tusbh_msc_get_vendor_name</a> (uint8_t dev_addr)</td></tr>
<tr class="memdesc:ga4e5db3391a76dfa58c0b8d257de8a66b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get SCSI vendor's name of MassStorage device. <a href="#ga4e5db3391a76dfa58c0b8d257de8a66b">More...</a><br/></td></tr>
<tr class="separator:ga4e5db3391a76dfa58c0b8d257de8a66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga54ac5a96247f082a0588af2453e61fd7"><td class="memItemLeft" align="right" valign="top">uint8_t const *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#ga54ac5a96247f082a0588af2453e61fd7">tusbh_msc_get_product_name</a> (uint8_t dev_addr)</td></tr>
<tr class="memdesc:ga54ac5a96247f082a0588af2453e61fd7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get SCSI product's name of MassStorage device. <a href="#ga54ac5a96247f082a0588af2453e61fd7">More...</a><br/></td></tr>
<tr class="separator:ga54ac5a96247f082a0588af2453e61fd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga426e1167966e5288fba25969dce279d0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#ga426e1167966e5288fba25969dce279d0">tusbh_msc_get_capacity</a> (uint8_t dev_addr, uint32_t *p_last_lba, uint32_t *p_block_size)</td></tr>
<tr class="memdesc:ga426e1167966e5288fba25969dce279d0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get SCSI Capacity of MassStorage device. <a href="#ga426e1167966e5288fba25969dce279d0">More...</a><br/></td></tr>
<tr class="separator:ga426e1167966e5288fba25969dce279d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga902d4394f85f043d50f29fe5fc085b73"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#ga902d4394f85f043d50f29fe5fc085b73">tusbh_msc_read10</a> (uint8_t dev_addr, uint8_t lun, void *p_buffer, uint32_t lba, uint16_t block_count) <a class="el" href="group___group___func_attr.html#gaa61f3d1a169c3d97d95072b1ee6493fd">ATTR_WARN_UNUSED_RESULT</a></td></tr>
<tr class="memdesc:ga902d4394f85f043d50f29fe5fc085b73"><td class="mdescLeft">&#160;</td><td class="mdescRight">Perform SCSI READ 10 command to read data from MassStorage device. <a href="#ga902d4394f85f043d50f29fe5fc085b73">More...</a><br/></td></tr>
<tr class="separator:ga902d4394f85f043d50f29fe5fc085b73"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae2e0d9cc75723cc2c9a78605d737f801"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gae2e0d9cc75723cc2c9a78605d737f801">tusbh_msc_write10</a> (uint8_t dev_addr, uint8_t lun, void const *p_buffer, uint32_t lba, uint16_t block_count) <a class="el" href="group___group___func_attr.html#gaa61f3d1a169c3d97d95072b1ee6493fd">ATTR_WARN_UNUSED_RESULT</a></td></tr>
<tr class="memdesc:gae2e0d9cc75723cc2c9a78605d737f801"><td class="mdescLeft">&#160;</td><td class="mdescRight">Perform SCSI WRITE 10 command to write data to MassStorage device. <a href="#gae2e0d9cc75723cc2c9a78605d737f801">More...</a><br/></td></tr>
<tr class="separator:gae2e0d9cc75723cc2c9a78605d737f801"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae7888d752d47cb1f52ede7e367630117"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gae7888d752d47cb1f52ede7e367630117">tusbh_msc_request_sense</a> (uint8_t dev_addr, uint8_t lun, uint8_t *p_data)</td></tr>
<tr class="memdesc:gae7888d752d47cb1f52ede7e367630117"><td class="mdescLeft">&#160;</td><td class="mdescRight">Perform SCSI REQUEST SENSE command, used to retrieve sense data from MassStorage device. <a href="#gae7888d752d47cb1f52ede7e367630117">More...</a><br/></td></tr>
<tr class="separator:gae7888d752d47cb1f52ede7e367630117"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab8b66e4a24a08259b5456dae8fe5f64b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gab8b66e4a24a08259b5456dae8fe5f64b">tusbh_msc_test_unit_ready</a> (uint8_t dev_addr, uint8_t lun, <a class="el" href="structmsc__cmd__status__wrapper__t.html">msc_cmd_status_wrapper_t</a> *p_csw) <a class="el" href="group___group___func_attr.html#gaa61f3d1a169c3d97d95072b1ee6493fd">ATTR_WARN_UNUSED_RESULT</a></td></tr>
<tr class="memdesc:gab8b66e4a24a08259b5456dae8fe5f64b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Perform SCSI TEST UNIT READY command to test if MassStorage device is ready. <a href="#gab8b66e4a24a08259b5456dae8fe5f64b">More...</a><br/></td></tr>
<tr class="separator:gab8b66e4a24a08259b5456dae8fe5f64b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab45280faacbb4169a7fb6773d9a5c2b4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gab45280faacbb4169a7fb6773d9a5c2b4">tusbh_msc_mounted_cb</a> (uint8_t dev_addr)</td></tr>
<tr class="memdesc:gab45280faacbb4169a7fb6773d9a5c2b4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function that will be invoked when a device with MassStorage interface is mounted. <a href="#gab45280faacbb4169a7fb6773d9a5c2b4">More...</a><br/></td></tr>
<tr class="separator:gab45280faacbb4169a7fb6773d9a5c2b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gababef5335d6f4dba72b30128dabaa0ec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#gababef5335d6f4dba72b30128dabaa0ec">tusbh_msc_unmounted_cb</a> (uint8_t dev_addr)</td></tr>
<tr class="memdesc:gababef5335d6f4dba72b30128dabaa0ec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function that will be invoked when a device with MassStorage interface is unmounted. <a href="#gababef5335d6f4dba72b30128dabaa0ec">More...</a><br/></td></tr>
<tr class="separator:gababef5335d6f4dba72b30128dabaa0ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga58e35f8eaf7c01cb3ff650da6fa222c8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___m_s_c___host.html#ga58e35f8eaf7c01cb3ff650da6fa222c8">tusbh_msc_isr</a> (uint8_t dev_addr, tusb_event_t event, uint32_t xferred_bytes)</td></tr>
<tr class="memdesc:ga58e35f8eaf7c01cb3ff650da6fa222c8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function that is invoked when an transferring event occurred. <a href="#ga58e35f8eaf7c01cb3ff650da6fa222c8">More...</a><br/></td></tr>
<tr class="separator:ga58e35f8eaf7c01cb3ff650da6fa222c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>The interface API includes status checking function, data transferring function and callback functions </p>
<h2 class="groupheader">Function Documentation</h2>
<a class="anchor" id="ga426e1167966e5288fba25969dce279d0"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a> tusbh_msc_get_capacity </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *&#160;</td>
<td class="paramname"><em>p_last_lba</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *&#160;</td>
<td class="paramname"><em>p_block_size</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Get SCSI Capacity of MassStorage device. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">p_last_lba</td><td>Last Logical Block Address of device </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">p_block_size</td><td>Block Size of device in bytes </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">pointer</td><td>to product's name or NULL if specified device does not support MassStorage </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>MassStorage's capacity can be computed by last LBA x block size (in bytes). During enumeration, the stack has already retrieved (via SCSI READ CAPACITY 10) and store this information internally. There is no need for application to re-send SCSI READ CAPACITY 10 command </dd></dl>
</div>
</div>
<a class="anchor" id="ga54ac5a96247f082a0588af2453e61fd7"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t const* tusbh_msc_get_product_name </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Get SCSI product's name of MassStorage device. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>pointer to product's name or NULL if specified device does not support MassStorage </dd></dl>
<dl class="section note"><dt>Note</dt><dd>SCSI product's name is 16-byte length field in <a class="el" href="structscsi__inquiry__data__t.html">scsi_inquiry_data_t</a>. During enumeration, the stack has already retrieved (via SCSI INQUIRY) and store this information internally. There is no need for application to re-send SCSI INQUIRY command or allocate buffer for this. </dd></dl>
</div>
</div>
<a class="anchor" id="ga4e5db3391a76dfa58c0b8d257de8a66b"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t const* tusbh_msc_get_vendor_name </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Get SCSI vendor's name of MassStorage device. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>pointer to vendor's name or NULL if specified device does not support MassStorage </dd></dl>
<dl class="section note"><dt>Note</dt><dd>SCSI vendor's name is 8-byte length field in <a class="el" href="structscsi__inquiry__data__t.html">scsi_inquiry_data_t</a>. During enumeration, the stack has already retrieved (via SCSI INQUIRY) and store this information internally. There is no need for application to re-send SCSI INQUIRY command or allocate buffer for this. </dd></dl>
</div>
</div>
<a class="anchor" id="gaa6cc5099b9bb874fb13e6e2e4fd1b4fc"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool tusbh_msc_is_busy </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Check if the interface is currently busy or not. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">true</td><td>if the interface is busy meaning the stack is still transferring/waiting data from/to device </td></tr>
<tr><td class="paramname">false</td><td>if the interface is not busy meaning the stack successfully transferred data from/to device </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This function is used to check if previous transfer is complete (success or error), so that the next transfer can be scheduled. User needs to make sure the corresponding interface is mounted (by <a class="el" href="group___m_s_c___host.html#gaf823d310e293579f62f7c78888980619">tusbh_msc_is_mounted</a>) before calling this function </dd></dl>
</div>
</div>
<a class="anchor" id="gaf823d310e293579f62f7c78888980619"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool tusbh_msc_is_mounted </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Check if device supports MassStorage interface or not. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">true</td><td>if device supports </td></tr>
<tr><td class="paramname">false</td><td>if device does not support or is not mounted </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga58e35f8eaf7c01cb3ff650da6fa222c8"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void tusbh_msc_isr </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">tusb_event_t&#160;</td>
<td class="paramname"><em>event</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>xferred_bytes</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Callback function that is invoked when an transferring event occurred. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>Address of device </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">event</td><td>an value from tusb_event_t </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">xferred_bytes</td><td>Number of bytes transferred via USB bus </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>event can be one of following<ul>
<li>TUSB_EVENT_XFER_COMPLETE : previously scheduled transfer completes successfully.</li>
<li>TUSB_EVENT_XFER_ERROR : previously scheduled transfer encountered a transaction error.</li>
<li>TUSB_EVENT_XFER_STALLED : previously scheduled transfer is stalled by device. </li>
</ul>
</dd>
<dd>
</dd></dl>
</div>
</div>
<a class="anchor" id="gab45280faacbb4169a7fb6773d9a5c2b4"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void tusbh_msc_mounted_cb </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Callback function that will be invoked when a device with MassStorage interface is mounted. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>Address of newly mounted device </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This callback should be used by Application to set-up interface-related data </dd></dl>
</div>
</div>
<a class="anchor" id="ga902d4394f85f043d50f29fe5fc085b73"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a> tusbh_msc_read10 </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>lun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>p_buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>lba</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t&#160;</td>
<td class="paramname"><em>block_count</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Perform SCSI READ 10 command to read data from MassStorage device. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">lun</td><td>Targeted Logical Unit </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">p_buffer</td><td>Buffer used to store data read from device. Must be accessible by USB controller (see <a class="el" href="group__group__configuration.html#ga977f8e429c64d2ea49ea42b5dac8a88c">TUSB_CFG_ATTR_USBRAM</a>) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">lba</td><td>Starting Logical Block Address to be read </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">block_count</td><td>Number of Block to be read </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">TUSB_ERROR_NONE</td><td>on success </td></tr>
<tr><td class="paramname">TUSB_ERROR_INTERFACE_IS_BUSY</td><td>if the interface is already transferring data with device </td></tr>
<tr><td class="paramname">TUSB_ERROR_DEVICE_NOT_READY</td><td>if device is not yet configured (by SET CONFIGURED request) </td></tr>
<tr><td class="paramname">TUSB_ERROR_INVALID_PARA</td><td>if input parameters are not correct </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This function is non-blocking and returns immediately. The result of USB transfer will be reported by the interface's callback function </dd></dl>
</div>
</div>
<a class="anchor" id="gae7888d752d47cb1f52ede7e367630117"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a> tusbh_msc_request_sense </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>lun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *&#160;</td>
<td class="paramname"><em>p_data</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Perform SCSI REQUEST SENSE command, used to retrieve sense data from MassStorage device. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">lun</td><td>Targeted Logical Unit </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p_data</td><td>Buffer to store response's data from device. Must be accessible by USB controller (see <a class="el" href="group__group__configuration.html#ga977f8e429c64d2ea49ea42b5dac8a88c">TUSB_CFG_ATTR_USBRAM</a>) </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">TUSB_ERROR_NONE</td><td>on success </td></tr>
<tr><td class="paramname">TUSB_ERROR_INTERFACE_IS_BUSY</td><td>if the interface is already transferring data with device </td></tr>
<tr><td class="paramname">TUSB_ERROR_DEVICE_NOT_READY</td><td>if device is not yet configured (by SET CONFIGURED request) </td></tr>
<tr><td class="paramname">TUSB_ERROR_INVALID_PARA</td><td>if input parameters are not correct </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This function is non-blocking and returns immediately. The result of USB transfer will be reported by the interface's callback function </dd></dl>
</div>
</div>
<a class="anchor" id="gab8b66e4a24a08259b5456dae8fe5f64b"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a> tusbh_msc_test_unit_ready </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>lun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structmsc__cmd__status__wrapper__t.html">msc_cmd_status_wrapper_t</a> *&#160;</td>
<td class="paramname"><em>p_csw</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Perform SCSI TEST UNIT READY command to test if MassStorage device is ready. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">lun</td><td>Targeted Logical Unit </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">TUSB_ERROR_NONE</td><td>on success </td></tr>
<tr><td class="paramname">TUSB_ERROR_INTERFACE_IS_BUSY</td><td>if the interface is already transferring data with device </td></tr>
<tr><td class="paramname">TUSB_ERROR_DEVICE_NOT_READY</td><td>if device is not yet configured (by SET CONFIGURED request) </td></tr>
<tr><td class="paramname">TUSB_ERROR_INVALID_PARA</td><td>if input parameters are not correct </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This function is non-blocking and returns immediately. The result of USB transfer will be reported by the interface's callback function </dd></dl>
</div>
</div>
<a class="anchor" id="gababef5335d6f4dba72b30128dabaa0ec"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void tusbh_msc_unmounted_cb </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Callback function that will be invoked when a device with MassStorage interface is unmounted. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>Address of newly unmounted device </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This callback should be used by Application to tear-down interface-related data </dd></dl>
</div>
</div>
<a class="anchor" id="gae2e0d9cc75723cc2c9a78605d737f801"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group___group___error.html#ga225612897c510054ef4026586562f716">tusb_error_t</a> tusbh_msc_write10 </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>dev_addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>lun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void const *&#160;</td>
<td class="paramname"><em>p_buffer</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t&#160;</td>
<td class="paramname"><em>lba</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t&#160;</td>
<td class="paramname"><em>block_count</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Perform SCSI WRITE 10 command to write data to MassStorage device. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">dev_addr</td><td>device address </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">lun</td><td>Targeted Logical Unit </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">p_buffer</td><td>Buffer containing data. Must be accessible by USB controller (see <a class="el" href="group__group__configuration.html#ga977f8e429c64d2ea49ea42b5dac8a88c">TUSB_CFG_ATTR_USBRAM</a>) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">lba</td><td>Starting Logical Block Address to be written </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">block_count</td><td>Number of Block to be written </td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">TUSB_ERROR_NONE</td><td>on success </td></tr>
<tr><td class="paramname">TUSB_ERROR_INTERFACE_IS_BUSY</td><td>if the interface is already transferring data with device </td></tr>
<tr><td class="paramname">TUSB_ERROR_DEVICE_NOT_READY</td><td>if device is not yet configured (by SET CONFIGURED request) </td></tr>
<tr><td class="paramname">TUSB_ERROR_INVALID_PARA</td><td>if input parameters are not correct </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This function is non-blocking and returns immediately. The result of USB transfer will be reported by the interface's callback function </dd></dl>
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated on Thu Apr 17 2014 13:05:28 for tinyusb by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li>
</ul>
</div>
</body>
</html>