<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=Reading_PHAT_Directories</id>
		<title>Reading PHAT Directories - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=Reading_PHAT_Directories"/>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Reading_PHAT_Directories&amp;action=history"/>
		<updated>2026-04-18T21:27:54Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=Reading_PHAT_Directories&amp;diff=236&amp;oldid=prev</id>
		<title>Harald: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Reading_PHAT_Directories&amp;diff=236&amp;oldid=prev"/>
				<updated>2016-10-27T16:03:00Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 16:03, 27 October 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;' lang='en'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=Reading_PHAT_Directories&amp;diff=235&amp;oldid=prev</id>
		<title>Harald: /* Test Environments */</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Reading_PHAT_Directories&amp;diff=235&amp;oldid=prev"/>
				<updated>2010-03-11T12:05:43Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Test Environments&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Test Environments ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;smalldiv&amp;quot;&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; |&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; | Comments&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; | '''Nut/OS&amp;lt;br&amp;gt;4.8.0'''&lt;br /&gt;
| style=&amp;quot;background-color:#F6F9ED&amp;quot; | '''Nut/OS&amp;lt;br&amp;gt;4.9.9'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Ethernut 3.0 E&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| NO&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Ethernut 3.1 D&amp;lt;/span&amp;gt;&lt;br /&gt;
| NutThreadYield&amp;lt;br /&amp;gt;added&lt;br /&gt;
| NT&lt;br /&gt;
| OK &amp;lt;br&amp;gt; [http://ethernut.de/arc/WIKI_BINARIES_ZIPPED/read-phat-dir-ENUT31-nutos-4.9.9.zip '''Binaries''']&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;EIR 1.0 C&amp;lt;/span&amp;gt;&lt;br /&gt;
| Set jumper JP1 &amp;lt;br&amp;gt;to DEBUG mode.&lt;br /&gt;
| OK &amp;lt;br&amp;gt; [http://ethernut.de/arc/WIKI_BINARIES_ZIPPED/read-phat-dir-EIR1C-nutos-4.8.0.zip '''Binaries''']&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:gray&amp;quot;&amp;gt;AT91SAM7X-EK&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| NT&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:gray&amp;quot;&amp;gt;AT91SAM9260-EK&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| NT&lt;br /&gt;
| NT&lt;br /&gt;
|-&lt;br /&gt;
| id=&amp;quot;compilertd&amp;quot; colspan=&amp;quot;5&amp;quot; |'''Compiler:''' ARM-GCC 4.2.2 ; AVR-GCC 4.3.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/board.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fs/phatfs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    uint32_t baud = 115200;&lt;br /&gt;
    int hvol;&lt;br /&gt;
    DIR *dir;&lt;br /&gt;
    struct dirent *dent;&lt;br /&gt;
    int cnt = 0;&lt;br /&gt;
&lt;br /&gt;
    NutRegisterDevice(&amp;amp;DEV_DEBUG, 0, 0);&lt;br /&gt;
    freopen(DEV_DEBUG_NAME, &amp;quot;w&amp;quot;, stdout);&lt;br /&gt;
    _ioctl(_fileno(stdout), UART_SETSPEED, &amp;amp;baud);&lt;br /&gt;
&lt;br /&gt;
    NutRegisterDevice(&amp;amp;devPhat0, 0, 0);&lt;br /&gt;
    NutRegisterDevice(&amp;amp;DEV_MMCARD, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
    printf(&amp;quot;Mounting card...&amp;quot;);&lt;br /&gt;
    hvol = _open(DEV_MMCARD_NAME &amp;quot;:1/PHAT0&amp;quot;, _O_RDWR | _O_BINARY);&lt;br /&gt;
    if (hvol == -1) {&lt;br /&gt;
        puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        dir = opendir(&amp;quot;PHAT0:/&amp;quot;);&lt;br /&gt;
        if(dir == NULL) {&lt;br /&gt;
            puts(&amp;quot;Cannot read root directory&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            for (;;) {&lt;br /&gt;
                dent = readdir(dir);&lt;br /&gt;
                if (dent == NULL) {&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
                puts(dent-&amp;gt;d_name);&lt;br /&gt;
                cnt++;&lt;br /&gt;
            }&lt;br /&gt;
            closedir(dir);&lt;br /&gt;
        }&lt;br /&gt;
        _close(hvol);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%d entries found\n&amp;quot;, cnt);&lt;br /&gt;
&lt;br /&gt;
    for(;;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Output ==&lt;br /&gt;
&lt;br /&gt;
The program will list all entries in the root directory.&lt;br /&gt;
&lt;br /&gt;
 Mounting card...OK&lt;br /&gt;
 test1.txt&lt;br /&gt;
 test2.txt&lt;br /&gt;
 2 entries found&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
All required header files must be included in the source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/board.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fs/phatfs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first, [[Using dev/board.h|dev/board.h]], defines some platform independent defaults like DEV_MMCARD and DEV_MMCARD_NAME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;fs/phatfs.h&amp;lt;/code&amp;gt; contains definitions of the [[PHAT filesystem]], while &amp;lt;code&amp;gt;dirent.h&amp;lt;/code&amp;gt; provides prototypes for reading directories.&lt;br /&gt;
&lt;br /&gt;
As usual, we must register all drivers we want to use. For reading MMC cards, the MMC driver as well as the PHAT files system driver are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NutRegisterDevice(&amp;amp;devPhat0, 0, 0);&lt;br /&gt;
NutRegisterDevice(&amp;amp;DEV_MMCARD, 0, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To access the card, it must be mounted first.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
hvol = _open(DEV_MMCARD_NAME &amp;quot;:1/PHAT0&amp;quot;, _O_RDWR | _O_BINARY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
dir = opendir(&amp;quot;PHAT0:/&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
dent = readdir(dir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
closedir(dir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pitfalls ==&lt;br /&gt;
&lt;br /&gt;
=== Interrupts not working ===&lt;br /&gt;
&lt;br /&gt;
The simple demo presented here may not work with all Nut/OS versions and target boards. Mounting the card fails with error 19 (ENODEV).&lt;br /&gt;
&lt;br /&gt;
When Nut/OS enters the main routine, all interrupts are disabled. They will become automatically enabled on the first context switch. On the other hand, the card detection is interrupt driven. As long as interrupts are disabled, no card detection is signaled and the MMC driver assumes, that no card has been inserted in the socket.&lt;br /&gt;
&lt;br /&gt;
For example, when running on Ethernut 3, our demo will use polling drivers only (devDebug and devNplMmc0) and no context switch &lt;br /&gt;
takes place, which would enable the card detect interrupt. A simple call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
NutThreadYield();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will solve this by forcing a context switch. Add this line before mounting the file system with _open(). Note, that you additionally need to include the header file sys/thread.h.&lt;br /&gt;
&lt;br /&gt;
Alternatively you can use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
sei();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for the AVR or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
asm volatile(&amp;quot;mrs r12, cpsr\n&amp;quot;&lt;br /&gt;
             &amp;quot;bic r12, r12, #0xC0\n&amp;quot;&lt;br /&gt;
             &amp;quot;msr cpsr_c, r12&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for the ARM to enable interrupts.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Reading PHAT Files]]&lt;br /&gt;
* [[Writing PHAT Files]]&lt;br /&gt;
* [[MMC MP3 Player]]&lt;br /&gt;
* More [[Nut/OS Examples]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Dirent.h dirent.h] Posix standard header for directory traversing.&lt;/div&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	</feed>