如何在不触及先前写入的情况下写入C中的数据寄存器?

时间:2015-05-25 18:56:39

标签: c linux linux-device-driver gpio

我是C的初学者,有这样的场景:

我可以成功写入带有数据寄存器0x103和方向寄存器0x95的gpio端口。如果我想写另一个引脚,我必须"覆盖"以前的针脚。

好像我先写00010000然后又想把另一个引脚设为高电平我需要写00010001才能使第一个" 1"低。

建议?

这是我的代码:

#include <stdio.h>
#include <stdio.h>
#include <sys/io.h>
#define outportb(a,b) outb(b,a)
#define inportb(a) inb(a)

void main(void)
{
    iopl(3); 
    /* set GPIO port1[7-0] as output mode */
    outportb(0x95, 0xff);

    /* write data to GPIO port1 */
    outportb(0x103, 0x11); 
} 

1 个答案:

答案 0 :(得分:1)

输出端口通常是可读的,所以你有

outportb(0x103, 0x10);                      // set b4
...
outportb(0x103, 0x11);                      // set b1 and b4

你可以这样说,

outportb(0x103, 0x10);                      // set b4
...
outportb(0x103, inportb(0x103) | 0x01);     // set b0 too

但有时不建议读取/修改/写入输出端口。无论如何,保持输出状态的副本,修改它并将其写入端口

更清晰
unsigned char bcopy = 0;                    // init port output
outportb(0x103, bcopy);
...
bcopy |= 0x10;                              // set b4
outportb(0x103, bcopy);
...
bcopy |= 0x01;                              // set b0
outportb(0x103, bcopy);
...
bcopy &= 0xEF;                              // now clear b4
outportb(0x103, bcopy);

或者作为单行:

outportb(0x103, bcopy = 0);                 // init port
...
outportb(0x103, bcopy |= 0x10);             // set b4
...
outportb(0x103, bcopy |= 0x01);             // set b0
...
outportb(0x103, bcopy &= 0xEF);             // now clear b4