2013-02-19 128 views
1

我能够使用mmap系统调用来控制GPIO,以直接从用户空间控制LED操作。现在我想在内核空间中实现驱动程序。- linux中的第一个内核空间驱动程序

我正在尝试在Linux中为ARM控制器RPi编写我的第一个用于16 * 2行LCD的内核空间设备驱动程序。 现在我需要为此目的访问GPIO。

在AVR中,我用这个来访问端口。

#define PORTA *(volatile unsigned char*)0x30 

我正在读LLD它告诉使用INB()& OUTB()函数来访问I/O端口。
http://www.makelinux.net/ldd3/chp-9-sect-2

1>我们不能使用#define端口地址来访问GPIO吗?

2>使用inb()& outb()函数来控制GPIO有什么好处?

请建议。

回答

0

1)定义的使用经常会简化你的任务。当然,你可以不使用你的端口定义,并在你需要访问端口的任何地方使用这种结构。但是,如果您更改了设备的设计,例如,如果您决定将LED连接到端口B,那么您将不得不用另一个地址替换0x30。此外,它会使您的代码变得不易读。或者,您可以声明一个可以访问您的端口的函数。如果这样一个简单的函数被声明为inline(如果你的编译器支持内联),那么性能没有区别。

2)使用inb()outb()的优点是程序的可移植性。如果这不是问题,那么直接访问您的端口就可以了。

+1

我认为inb()使用I/O地址空间来读取端口,而不是使用内存映射空间。 – Katoch 2013-02-20 03:59:04

+0

我不争辩,请查看编译器和平台文档 – Serge 2013-02-20 04:03:20

+0

您的程序的可移植性是什么意思? – Katoch 2013-02-20 04:10:32

1

在AVR中我用这个来访问端口。

#define PORTA *(volatile unsigned char*)0x30 

这是一个不正确的定义,重载符号PORTA
除了将端口地址定义为0x30外,您还正在取消引用该位置。
所以它实际上是一个读取操作,但没有任何迹象表明名称,即你已经真正定义了一个宏为READ_PORTA

1>我们不能使用#define端口地址来访问GPIO吗?

当然你可以(也应该)。

#define PORTA (unsigned char *)0x30 

您会在Linux源代码树的设备寄存器的头文件中找到类似的语句。在开发新的设备驱动程序时,我为所有设备的寄存器和命令代码寻找头文件#defines,并在没有文件可用的情况下开始写入一个。

2>使用inb()& outb()函数控制GPIO有什么好处?

无论架构使用I/O端口还是内存映射I/O,代码都是执行I/O的明确声明。
任何人阅读下面应该能够推断出是怎么回事:使用宏时

x = inb(PORTA); 

与困惑:

x = PORTA; 

使用重载的宏将无法通过代码上面的语句由有能力的编码员进行审查。您还应该熟悉和使用Linux kernel coding style

相关问题