* PPC440EPx GPIO control help
@ 2007-10-17 3:14 Dell Query
0 siblings, 0 replies; 12+ messages in thread
From: Dell Query @ 2007-10-17 3:14 UTC (permalink / raw)
To: linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 555 bytes --]
Hi,
I am a Linux and PPC newbie.
I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21. What I would want to do is to control (write and read values to) its GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and inportb(0x378) to read. I read the PPC440EPx manual but I find it difficult to understand.
Could anyone show me any tutorial or some sample codes?
Thanks,
Dell
---------------------------------
Moody friends. Drama queens. Your life? Nope! - their life, your story.
Play Sims Stories at Yahoo! Games.
[-- Attachment #2: Type: text/html, Size: 639 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* PPC440EPx GPIO control help
@ 2007-10-17 3:29 Dell Query
2007-10-17 4:15 ` David Hawkins
0 siblings, 1 reply; 12+ messages in thread
From: Dell Query @ 2007-10-17 3:29 UTC (permalink / raw)
To: linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 542 bytes --]
Hi,
I am a Linux and PPC newbie.
I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21. What I would want to do is to control (write and read values to) its GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and inportb(0x378) to read. I read the PPC440EPx manual but I find it difficult to understand.
Could anyone show me any tutorial or some sample codes?
Thanks,
Dell
---------------------------------
Take the Internet to Go: Yahoo!Go puts the Internet in your pocket: mail, news, photos & more.
[-- Attachment #2: Type: text/html, Size: 884 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 3:29 PPC440EPx GPIO control help Dell Query
@ 2007-10-17 4:15 ` David Hawkins
2007-10-17 6:21 ` Jeff Mock
0 siblings, 1 reply; 12+ messages in thread
From: David Hawkins @ 2007-10-17 4:15 UTC (permalink / raw)
To: Dell Query; +Cc: linuxppc-embedded
Hi Dell,
> I am a Linux and PPC newbie.
Ok.
> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
> What I would want to do is to control (write and read values to) its
> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
> inportb(0x378) to read. I read the PPC440EPx manual but I find it
> difficult to understand.
>
> Could anyone show me any tutorial or some sample codes?
I copied the code below from some test code I wrote for a TS7300
board (uses an ARM EP9302 processor). However, since its user-space
code it should work fine.
Generally for manipulating I/Os you write a custom driver. However,
when getting to know a processor, it sometimes helps to cheat and
just write to registers directly.
The code below uses /dev/mem to map a page or more of the processor
address space into your process. Go find the byte address of your
GPIO registers and pass that as the argument.
Google for /dev/mem and you'll find lots of code that looks more
or less like this. This code just gives you a minimal console so
that you can mess with multiple registers.
BTW, you can really screw yourself if you mess with registers
you shouldn't, eg. memory controller settings etc. So be careful.
From the looks of the code, it provides options for
32-bit access or 8-bit access.
Cheers,
Dave
/*
* mem_debug.c
*
* 5/10/07 D. W. Hawkins (dwh@ovro.caltech.edu)
*
* A debug console for read/write access to /dev/mem mapped
* areas.
*/
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <unistd.h>
void display_help();
void change_mem(char *cmd);
void display_mem(char *cmd);
void process_command(char *cmd);
/* Mapped address and size */
static char *mem_addr = NULL;
static unsigned int mem_phys = 0;
static unsigned int mem_pages = 0;
static unsigned int mem_size = 0;
static void show_usage()
{
printf("\nUsage: mem_debug -a <address> -n <pages>\n"\
" -h Help (this message)\n"\
" -a <address> Hex address to start the map\n"\
" -n <pages> Number of pages to map\n\n");
}
int main(int argc, char *argv[])
{
int opt; /* getopt processing */
int fd; /* /dev/mem file descriptor */
char buf[200]; /* command processing buffer */
int len = 200;
int page_size = getpagesize();
int status;
while ((opt = getopt(argc, argv, "a:hn:")) != -1) {
switch (opt) {
case 'a':
status = sscanf(optarg, "%X", &mem_phys);
if (status != 1) {
printf("Parse error for -a option\n");
show_usage();
return -1;
}
break;
case 'h':
show_usage();
return -1;
case 'n':
mem_pages = atoi(optarg);
break;
default:
show_usage();
return -1;
}
}
if (mem_phys != (mem_phys/page_size)*page_size) {
printf("Error: the address must be page-aligned (0x%X)\n",
page_size);
return -1;
}
if (mem_pages == 0) {
mem_pages = 1;
}
mem_size = mem_pages*page_size;
/* Startup */
printf("\n------------------------\n");
printf("/dev/mem debug interface\n");
printf("========================\n\n");
/* Open /dev/mem and map it */
printf(" * open /dev/mem\n");
fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0) {
printf("Open /dev/mem failed - %s\n",
strerror(errno));
return -1;
}
printf(" * map %d page(s) (%d-bytes) at address 0x%.8X\n",
mem_pages, mem_size, mem_phys);
mem_addr = (char *)mmap(
0,
mem_size,
PROT_READ|PROT_WRITE,
MAP_SHARED,
fd,
mem_phys);
if (mem_addr == (char *)MAP_FAILED) {
printf("Error: mmap failed\n");
close(fd);
return -1;
}
/* Display help */
display_help();
/* Process commands */
while (1) {
printf("CMD> ");
fflush(stdout);
fgets(buf,len,stdin);
process_command(buf);
}
/* Cleanup */
munmap((void *)mem_addr, mem_pages*page_size);
close(fd);
return 0;
}
/*--------------------------------------------------------------------
* User interface
*--------------------------------------------------------------------
*/
void display_help()
{
printf("\n ? Help\n");
printf(" dw addr len Display len words starting from addr\n");
printf(" db addr len Display len bytes starting from addr\n");
printf(" cw addr val Change word at addr to val\n");
printf(" cb addr val Change byte at addr to val\n");
printf(" q Quit\n");
printf("\n Notes:\n");
printf(" * addr, len, and val are interpreted as hex values\n");
printf(" * addresses are always byte based\n");
printf(" * addresses are offsets relative to the base address\n\n");
}
void process_command(char *cmd)
{
if (cmd[0] == '\0') {
return;
}
switch (cmd[0]) {
case '?':
display_help();
break;
case 'd':
case 'D':
display_mem(cmd);
break;
case 'c':
case 'C':
change_mem(cmd);
break;
case 'q':
case 'Q':
exit(0);
default:
break;
}
return;
}
void display_mem(char *cmd)
{
char width = 0;
int addr = 0;
int len = 0;
int status;
int i, data;
/* d, db, dw */
status = sscanf(cmd, "%*c%c %x %x", &width, &addr, &len);
if (status != 3) {
printf("syntax error (use ? for help)\n");
return;
}
if (len > mem_size) {
len = mem_size;
}
/* Convert to offset if required */
if (addr >= mem_phys) {
addr -= mem_phys;
}
if (addr >= mem_size) {
printf("Illegal address\n");
return;
}
switch (width) {
case 'b':
for (i = 0; i < len; i++) {
if ((i%16) == 0) {
printf("\n%.8X: ", mem_phys + addr + i);
}
data = (int)(mem_addr[addr+i]) & 0xFF;
printf("%.02X ", data);
}
printf("\n");
break;
default:
for (i = 0; i < len; i+=4) {
if ((i%16) == 0) {
printf("\n%.8X: ", mem_phys + addr + i);
}
data = *(int *)(mem_addr + addr + i);
printf("%.08X ", data);
}
printf("\n");
break;
}
printf("\n");
return;
}
void change_mem(char *cmd)
{
char width = 0;
int addr = 0;
int data = 0;
int status;
/* c, cb, cw */
status = sscanf(cmd, "%*c%c %x %x", &width, &addr, &data);
if (status != 3) {
printf("syntax error (use ? for help)\n");
return;
}
/* Convert to offset if required */
if (addr >= mem_phys) {
addr -= mem_phys;
}
if (addr >= mem_size) {
printf("Illegal address\n");
return;
}
switch (width) {
case 'b':
mem_addr[addr] = data & 0xFF;
break;
default:
*(int *)(mem_addr + addr) = data;
break;
}
return;
}
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 4:15 ` David Hawkins
@ 2007-10-17 6:21 ` Jeff Mock
2007-10-17 10:49 ` Josh Boyer
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Jeff Mock @ 2007-10-17 6:21 UTC (permalink / raw)
To: David Hawkins; +Cc: linuxppc-embedded
David Hawkins wrote:
>> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
>> What I would want to do is to control (write and read values to) its
>> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
>> inportb(0x378) to read. I read the PPC440EPx manual but I find it
>> difficult to understand.
>>
>> Could anyone show me any tutorial or some sample codes?
>
> I copied the code below from some test code I wrote for a TS7300
> board (uses an ARM EP9302 processor). However, since its user-space
> code it should work fine.
>
I might be a little out of date, but I think you must write your own
driver to wiggle the GPIO pins on a 440 processor. I just finished a
project using a 440GX with a 2.6.15 kernel (we froze the code about 8
months ago).
The 440 powerPC core is a 32-bit processor with 36-bit physical
addresses. The physical address for the GPIO pins is someplace above
4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
address space, as a result you can't write a user space program on the
440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
for later kernels).
This tossed me into writing device drivers, which turned out to be not
nearly as scary as I imagined. The Linux Device Drivers book is fabulous:
http://lwn.net/Kernel/LDD3/
Here is a driver for the 440GX that controls an LED on one of the GPIO
pins you can use as an example. The device /dev/pdev-led has a
read/write interface so you can do something like this:
# echo "1" > /dev/pdev-led # turn on LED
# echo "0" > /dev/pdev-led # turn off LED
It also has a /proc interface so you can cat /proc/pdev-led to read the
status of the LED. There are several other drivers there that probably
won't be interesting, but pdev-led.c is probably a good starting point:
http://www.mock.com/wsvn/listing.php?repname=mock.pdev&path=/trunk/sw/driver/
jeff
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 6:21 ` Jeff Mock
@ 2007-10-17 10:49 ` Josh Boyer
2007-10-17 12:17 ` Misbah khan
2007-10-17 20:26 ` Jeff Mock
2007-10-17 16:19 ` David Hawkins
2007-10-18 2:00 ` Dell Query
2 siblings, 2 replies; 12+ messages in thread
From: Josh Boyer @ 2007-10-17 10:49 UTC (permalink / raw)
To: Jeff Mock; +Cc: linuxppc-embedded
On Tue, 2007-10-16 at 23:21 -0700, Jeff Mock wrote:
> David Hawkins wrote:
> >> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
> >> What I would want to do is to control (write and read values to) its
> >> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
> >> inportb(0x378) to read. I read the PPC440EPx manual but I find it
> >> difficult to understand.
> >>
> >> Could anyone show me any tutorial or some sample codes?
> >
> > I copied the code below from some test code I wrote for a TS7300
> > board (uses an ARM EP9302 processor). However, since its user-space
> > code it should work fine.
> >
>
> I might be a little out of date, but I think you must write your own
> driver to wiggle the GPIO pins on a 440 processor. I just finished a
> project using a 440GX with a 2.6.15 kernel (we froze the code about 8
> months ago).
>
> The 440 powerPC core is a 32-bit processor with 36-bit physical
> addresses. The physical address for the GPIO pins is someplace above
> 4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
> address space, as a result you can't write a user space program on the
> 440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
> for later kernels).
This depends on the 440 chip itself. If I recall correctly, the
440EP(x) chips don't have I/O above 4GB.
josh
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 10:49 ` Josh Boyer
@ 2007-10-17 12:17 ` Misbah khan
2007-10-17 20:26 ` Jeff Mock
1 sibling, 0 replies; 12+ messages in thread
From: Misbah khan @ 2007-10-17 12:17 UTC (permalink / raw)
To: linuxppc-embedded
I Prefer that you write a coustem driver. map the GPIO address (Either make
use of mapped area of GPIO that u may find in the source for comercial
kernel or else map the physical address in the driver and access it ).
---Misbah
Josh Boyer-4 wrote:
>
> On Tue, 2007-10-16 at 23:21 -0700, Jeff Mock wrote:
>> David Hawkins wrote:
>> >> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
>> >> What I would want to do is to control (write and read values to) its
>> >> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
>> >> inportb(0x378) to read. I read the PPC440EPx manual but I find it
>> >> difficult to understand.
>> >>
>> >> Could anyone show me any tutorial or some sample codes?
>> >
>> > I copied the code below from some test code I wrote for a TS7300
>> > board (uses an ARM EP9302 processor). However, since its user-space
>> > code it should work fine.
>> >
>>
>> I might be a little out of date, but I think you must write your own
>> driver to wiggle the GPIO pins on a 440 processor. I just finished a
>> project using a 440GX with a 2.6.15 kernel (we froze the code about 8
>> months ago).
>>
>> The 440 powerPC core is a 32-bit processor with 36-bit physical
>> addresses. The physical address for the GPIO pins is someplace above
>> 4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
>> address space, as a result you can't write a user space program on the
>> 440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
>> for later kernels).
>
> This depends on the 440 chip itself. If I recall correctly, the
> 440EP(x) chips don't have I/O above 4GB.
>
> josh
>
> _______________________________________________
> Linuxppc-embedded mailing list
> Linuxppc-embedded@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-embedded
>
>
--
View this message in context: http://www.nabble.com/PPC440EPx-GPIO-control-help-tf4638058.html#a13252501
Sent from the linuxppc-embedded mailing list archive at Nabble.com.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 6:21 ` Jeff Mock
2007-10-17 10:49 ` Josh Boyer
@ 2007-10-17 16:19 ` David Hawkins
2007-10-18 2:05 ` Dell Query
2007-10-18 2:00 ` Dell Query
2 siblings, 1 reply; 12+ messages in thread
From: David Hawkins @ 2007-10-17 16:19 UTC (permalink / raw)
To: linuxppc-embedded
Hi Dell,
If you do decide to look at kernel drivers, Jeff has sent you
code, and I also have a tutorial with example code you are
welcome to look at:
http://www.ovro.caltech.edu/~dwh/correlator/pdf/LNX-723-Hawkins.pdf
http://www.ovro.caltech.edu/~dwh/correlator/software/driver_design.tar.gz
Feel free to ask questions. I recall writing some test driver
code for the 440EP Yosemite board too. I'm just not sure where
I put it ... :)
Cheers,
Dave
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 10:49 ` Josh Boyer
2007-10-17 12:17 ` Misbah khan
@ 2007-10-17 20:26 ` Jeff Mock
2007-10-17 20:41 ` Josh Boyer
1 sibling, 1 reply; 12+ messages in thread
From: Jeff Mock @ 2007-10-17 20:26 UTC (permalink / raw)
To: Josh Boyer; +Cc: linuxppc-embedded
Josh Boyer wrote:
> On Tue, 2007-10-16 at 23:21 -0700, Jeff Mock wrote:
>> David Hawkins wrote:
>>>> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
>>>> What I would want to do is to control (write and read values to) its
>>>> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
>>>> inportb(0x378) to read. I read the PPC440EPx manual but I find it
>>>> difficult to understand.
>>>>
>>>> Could anyone show me any tutorial or some sample codes?
>>> I copied the code below from some test code I wrote for a TS7300
>>> board (uses an ARM EP9302 processor). However, since its user-space
>>> code it should work fine.
>>>
>> I might be a little out of date, but I think you must write your own
>> driver to wiggle the GPIO pins on a 440 processor. I just finished a
>> project using a 440GX with a 2.6.15 kernel (we froze the code about 8
>> months ago).
>>
>> The 440 powerPC core is a 32-bit processor with 36-bit physical
>> addresses. The physical address for the GPIO pins is someplace above
>> 4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
>> address space, as a result you can't write a user space program on the
>> 440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
>> for later kernels).
>
> This depends on the 440 chip itself. If I recall correctly, the
> 440EP(x) chips don't have I/O above 4GB.
>
At first I thought you were right, I remember something about the 440GX
being the weird processor with I/O mapped above 4GB. I just took a look
at the 440EPx datasheet on the AMCC website and it looks like the GPIO
registers are mapped above 4GB:
GPIO0 controller 1 EF60 0B00
GPIO1 controller 1 EF60 0C00
Someone has to do the ioremap() to get at these physical addresses, so I
think you have to write a driver to get them mapped into user space.
It's unfortunate, especially for someone just getting started with the
processor that just wants to turn on an LED...
jeff
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 20:26 ` Jeff Mock
@ 2007-10-17 20:41 ` Josh Boyer
0 siblings, 0 replies; 12+ messages in thread
From: Josh Boyer @ 2007-10-17 20:41 UTC (permalink / raw)
To: Jeff Mock; +Cc: linuxppc-embedded
On Wed, 17 Oct 2007 13:26:42 -0700
Jeff Mock <jeff@mock.com> wrote:
>
>
> Josh Boyer wrote:
> > On Tue, 2007-10-16 at 23:21 -0700, Jeff Mock wrote:
> >> David Hawkins wrote:
> >>>> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
> >>>> What I would want to do is to control (write and read values to) its
> >>>> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
> >>>> inportb(0x378) to read. I read the PPC440EPx manual but I find it
> >>>> difficult to understand.
> >>>>
> >>>> Could anyone show me any tutorial or some sample codes?
> >>> I copied the code below from some test code I wrote for a TS7300
> >>> board (uses an ARM EP9302 processor). However, since its user-space
> >>> code it should work fine.
> >>>
> >> I might be a little out of date, but I think you must write your own
> >> driver to wiggle the GPIO pins on a 440 processor. I just finished a
> >> project using a 440GX with a 2.6.15 kernel (we froze the code about 8
> >> months ago).
> >>
> >> The 440 powerPC core is a 32-bit processor with 36-bit physical
> >> addresses. The physical address for the GPIO pins is someplace above
> >> 4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
> >> address space, as a result you can't write a user space program on the
> >> 440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
> >> for later kernels).
> >
> > This depends on the 440 chip itself. If I recall correctly, the
> > 440EP(x) chips don't have I/O above 4GB.
> >
>
> At first I thought you were right, I remember something about the 440GX
> being the weird processor with I/O mapped above 4GB. I just took a look
> at the 440EPx datasheet on the AMCC website and it looks like the GPIO
> registers are mapped above 4GB:
>
> GPIO0 controller 1 EF60 0B00
> GPIO1 controller 1 EF60 0C00
Actually, it's 440EP that has the addresses below 4GB, not 440EPx. My
apologies for the confusion. As far as "weird" goes in the 44x world,
440EP is the oddball as I believe most all other 44x versions have some
if not all I/O above 4GB.
josh
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 6:21 ` Jeff Mock
2007-10-17 10:49 ` Josh Boyer
2007-10-17 16:19 ` David Hawkins
@ 2007-10-18 2:00 ` Dell Query
2007-10-18 3:22 ` Jeff Mock
2 siblings, 1 reply; 12+ messages in thread
From: Dell Query @ 2007-10-18 2:00 UTC (permalink / raw)
To: Jeff Mock; +Cc: linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 2408 bytes --]
Hi Jeff,
I read the device drivers part of the LDD3, it's really difficult as I expected. Thanks for the sample codes. I'll develop my own driver basing from your samples. Regarding reading the status of the LED, is it really necessary to use proc?
Regards,
dell
Jeff Mock <jeff@mock.com> wrote:
David Hawkins wrote:
>> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
>> What I would want to do is to control (write and read values to) its
>> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
>> inportb(0x378) to read. I read the PPC440EPx manual but I find it
>> difficult to understand.
>>
>> Could anyone show me any tutorial or some sample codes?
>
> I copied the code below from some test code I wrote for a TS7300
> board (uses an ARM EP9302 processor). However, since its user-space
> code it should work fine.
>
I might be a little out of date, but I think you must write your own
driver to wiggle the GPIO pins on a 440 processor. I just finished a
project using a 440GX with a 2.6.15 kernel (we froze the code about 8
months ago).
The 440 powerPC core is a 32-bit processor with 36-bit physical
addresses. The physical address for the GPIO pins is someplace above
4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
address space, as a result you can't write a user space program on the
440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
for later kernels).
This tossed me into writing device drivers, which turned out to be not
nearly as scary as I imagined. The Linux Device Drivers book is fabulous:
http://lwn.net/Kernel/LDD3/
Here is a driver for the 440GX that controls an LED on one of the GPIO
pins you can use as an example. The device /dev/pdev-led has a
read/write interface so you can do something like this:
# echo "1" > /dev/pdev-led # turn on LED
# echo "0" > /dev/pdev-led # turn off LED
It also has a /proc interface so you can cat /proc/pdev-led to read the
status of the LED. There are several other drivers there that probably
won't be interesting, but pdev-led.c is probably a good starting point:
http://www.mock.com/wsvn/listing.php?repname=mock.pdev&path=/trunk/sw/driver/
jeff
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
[-- Attachment #2: Type: text/html, Size: 2806 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-17 16:19 ` David Hawkins
@ 2007-10-18 2:05 ` Dell Query
0 siblings, 0 replies; 12+ messages in thread
From: Dell Query @ 2007-10-18 2:05 UTC (permalink / raw)
To: David Hawkins, linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 725 bytes --]
Hi David,
I'll take a look at the PDF file you sent me.
Thanks,
dell
David Hawkins <dwh@ovro.caltech.edu> wrote: Hi Dell,
If you do decide to look at kernel drivers, Jeff has sent you
code, and I also have a tutorial with example code you are
welcome to look at:
http://www.ovro.caltech.edu/~dwh/correlator/pdf/LNX-723-Hawkins.pdf
http://www.ovro.caltech.edu/~dwh/correlator/software/driver_design.tar.gz
Feel free to ask questions. I recall writing some test driver
code for the 440EP Yosemite board too. I'm just not sure where
I put it ... :)
Cheers,
Dave
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
[-- Attachment #2: Type: text/html, Size: 961 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: PPC440EPx GPIO control help
2007-10-18 2:00 ` Dell Query
@ 2007-10-18 3:22 ` Jeff Mock
0 siblings, 0 replies; 12+ messages in thread
From: Jeff Mock @ 2007-10-18 3:22 UTC (permalink / raw)
To: Dell Query; +Cc: linuxppc-embedded
Oh no, it's not necessary to use /proc, pdev-lcd was my first device
driver. I wanted to try out all of the different features and it was
fun to add a /proc interface. It could just as easily have a read
interface or an ioctl() or whatever.
I think LDD3 is fantastic, stick with it and go slowly. Start out by
writing little test drivers on your desktop machine where it's easy to
debug. LDD3 really got me over the hump of writing device drivers.
jeff
Dell Query wrote:
> Hi Jeff,
>
> I read the device drivers part of the LDD3, it's really difficult as
> I
expected. Thanks for the sample codes. I'll develop my own driver basing
from your samples. Regarding reading the status of the LED, is it really
necessary to use proc?
> Regards,
> dell
>
> Jeff Mock <jeff@mock.com> wrote:
> David Hawkins wrote:
>>> I have a PPC440EPx Sequoia Evaluation board that runs on Linux 2.6.21.
>>> What I would want to do is to control (write and read values to) its
>>> GPIO. Perhaps similar to Turbo C's outputb(0x378,0x01) to write and
>>> inportb(0x378) to read. I read the PPC440EPx manual but I find it
>>> difficult to understand.
>>>
>>> Could anyone show me any tutorial or some sample codes?
>> I copied the code below from some test code I wrote for a TS7300
>> board (uses an ARM EP9302 processor). However, since its user-space
>> code it should work fine.
>>
>
> I might be a little out of date, but I think you must write your own
> driver to wiggle the GPIO pins on a 440 processor. I just finished a
> project using a 440GX with a 2.6.15 kernel (we froze the code about 8
> months ago).
>
> The 440 powerPC core is a 32-bit processor with 36-bit physical
> addresses. The physical address for the GPIO pins is someplace above
> 4GB. An mmap() of /dev/mem only lets you map the lower 4GB of the
> address space, as a result you can't write a user space program on the
> 440 to wiggle the GPIO pins. (This was true with 2.6.15, I can't speak
> for later kernels).
>
> This tossed me into writing device drivers, which turned out to be not
> nearly as scary as I imagined. The Linux Device Drivers book is fabulous:
>
> http://lwn.net/Kernel/LDD3/
>
> Here is a driver for the 440GX that controls an LED on one of the GPIO
> pins you can use as an example. The device /dev/pdev-led has a
> read/write interface so you can do something like this:
>
> # echo "1" > /dev/pdev-led # turn on LED
> # echo "0" > /dev/pdev-led # turn off LED
>
> It also has a /proc interface so you can cat /proc/pdev-led to read the
> status of the LED. There are several other drivers there that probably
> won't be interesting, but pdev-led.c is probably a good starting point:
>
> http://www.mock.com/wsvn/listing.php?repname=mock.pdev&path=/trunk/sw/driver/
>
> jeff
>
>
>
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2007-10-18 6:49 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-17 3:29 PPC440EPx GPIO control help Dell Query
2007-10-17 4:15 ` David Hawkins
2007-10-17 6:21 ` Jeff Mock
2007-10-17 10:49 ` Josh Boyer
2007-10-17 12:17 ` Misbah khan
2007-10-17 20:26 ` Jeff Mock
2007-10-17 20:41 ` Josh Boyer
2007-10-17 16:19 ` David Hawkins
2007-10-18 2:05 ` Dell Query
2007-10-18 2:00 ` Dell Query
2007-10-18 3:22 ` Jeff Mock
-- strict thread matches above, loose matches on Subject: below --
2007-10-17 3:14 Dell Query
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).