Articles of gpio

使用GPIO(LED)作为显示板

我正在尝试使用OMAP L132创build一个定制电路板。 在“引导内核”之后,几乎所有的时间都在串口显示之前崩溃了我无法弄清楚log_buf(printk的输出)是什么原因导致崩溃,所以我尝试了(而且我还在尝试)使用leds在船上。 LED由GPIO连接。 据我了解内核不能直接访问物理内存,我需要通过一些映射到内核虚拟地址。 但是,当我试图在start_kernel函数中configurationGPIO时,它会崩溃。 ioremap(…),gpio_direction_output(…)崩溃,有关SLUB的错误(无法分配内存节点-1; SLUB:Genslabs = 11,HWalign = 32,Order = 0-3,MinObjects = 0, CPU = 1,节点= 1)我只是试图访问控制GPIO的寄存器,我在这里错过了哪些初始化? GPIO可以在内核中访问的最早点是什么? 我应该在uboot中初始化一些东西吗? 在此先感谢,阿里

从gpioinput读取的字节数是零

当试图读取gpio输出引脚时,我有一些奇怪的行为。 我得到的第一次读取返回1(1字节读取),但接下来读取从相同的GPIO返回0.我会假设它应该总是读1,因为总是有东西要从input引脚读取。 gpio = 8; fd = open("/sys/class/gpio/export", O_WRONLY); sprintf(buf, "%d", gpio); rc = write(fd, buf, strlen(buf)); if (rc == -1) printf("failed in write 17\n"); close(fd); sprintf(buf, "/sys/class/gpio/gpio%d/direction", gpio); fd = open(buf, O_WRONLY); rc = write(fd, "in", 2); if (rc == -1) printf("failed in write 18\n"); close(fd); sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio); gpio_tdo = open(buf, O_RDWR); rc […]

通过GPIO信号使能从睡眠模式唤醒

我需要通过GPIO信号唤醒运行Angstrom OS的BeagleBone设备。 我读过使用/sys/class/gpio/gpioXX/power/wakeup是要做的。 问题是在电源目录下没有任何“唤醒”文件。 那么,我该如何着手激活它呢? 有没有解决scheme没有重新编译内核? 我可以从GPIO值读取很好,所以GPIO sysfs正在工作。

如何从linux内核生成稳定的37kHz GPIO触发器?

目前我有一个微控制器负责处理红外TX载波的产生,但是我开始想知道是否可以处理它,并在Linux端做这个工作 – 这样就降低了embedded式系统的成本。 我在飞思卡尔i.mx233(454MHz ARM9)上运行,如果我通过/dev/mem直接访问registry,我可以实现相当稳定的5MHz触发GPIO引脚。 由于我需要37kHz,我开始寻找放慢速度的方法,但是至less对于这个目的, nanowait()似乎太粗糙了。 我find了一个在rand循环中调用rand()的解决scheme,我似乎可以很好地生成38.4kHz的信号,但是根据示波器,有时会出现一些不可接受的抖动。 (据我所知,这样做对于资源来说是相当浪费的,但是当TX需要完成的时候,系统并没有真正的其他任务) 我的问题:Freescales内核代码(3.8分支)没有CONFIG_PREEMPT_RT补丁,所以这也许是我应该考虑的一件事,但在此之前: 我可以通过编写一个内核模块来从内核驱动GPIO来实现更精确的性能吗? 我需要从用户空间(要发送的数据)读取一些数据,但除此之外,我只需要在GPIO末尾以指定的频率触发LED,所以驱动程序应该非常简单。 我可以强制我的驱动程序的优先级,以便其他任务不会中断这个GPIO触发? (数据发送目前大约需要400ms,而且很less完成) 有没有更好的方法来创build每37kHz的中断,这样我就不会通过软件停止系统? 微控制器是完成这种任务,但如果可能的话,这将是很好的避免这种成本开销…

从c#和mono启动进程时内存不足

我正在使用Debian安装的embedded式Linux板(Atmel AT91SAM)。 有一个单声道应用程序正在运行,并通过启动一个新的系统进程和bash来调用cat ,从而定期(如每500ms)开关GPIO的输出。 一段时间后,我得到一个“ 内存不足 ”的例外,输出没有被设置一段时间后,它几秒钟后“恢复自己”。 这是不是这样设置pioC10? 如果是这样,我应该如何设置值文件? 可能会发生这种内存exception,因为目前无法访问GPIO? 有没有一个干净的方式来处理过程,或者当方法被自动closures时完成? private void OnTimer1Event(object source, ElapsedEventArgs e) { alternateBlinkTimer1.Stop(); alternateBlinkTimer2.Start(); try { var processStartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = "-c \"echo 1 > /sys/class/gpio/pioC10/value\"" }; System.Diagnostics.Process process = new Process(); process.StartInfo = processStartInfo; process.Start(); } catch (Exception err) { log.Error(err.Message); } […]

在ARM上的Linux的WRITE和READ寄存器

我正在尝试按照以下步骤在我的ARM9(SAM9X25)上读写寄存器: http ://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3750.html 我结束了以下代码: #include "stdio.h" #define PIO_WPMR_BANK_D 0xFFFFFAE4 // PIO Write Protection Mode Register Bank D #define PIO_PUER_BANK_D 0xFFFFFA64 // PIO Pull-Up Enable Register Bank D #define PIO_PUSR_BANK_D 0xFFFFFA68 // PIO Pull-Up Status Register Bank D #define MASK_LED7 0xFFDFFFFF // LED7 Mask #define DESABLE_WRITE_PROTECTION_BANK_D 0x50494F00 // Desable write protection Bank D int main(void) { […]

虚拟GPIO仿真

是否存在用于编程需要的虚拟GPIO驱动程序? 我必须在我的Linux PC上开发一个软件,然后在一些带有物理GPIO(CHIP,OpenWRT,等等)的embedded式系统上尝试它。 谢谢!

Beaglebone am335x通过mmap访问GPIO,设置和清除引脚

我正在写一个简单的程序来设置和清除一个引脚(目的是使用该引脚作为一个自定义的spi_CS)。 我能够导出该引脚(gpio1_17,端口9引脚23 bb白色),并通过文件系统使用,但我必须加快它的速度。 这是代码: uint32_t *gpio; int fd = open("/dev/mem", O_RDWR|O_SYNC); if (fd < 0){ fprintf(stderr, "Unable to open port\n\r"); exit(fd); } gpio =(uint32_t *) mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO1_offset); // start of GPIOA if(gpio == (void *) -1) { printf("Memory map failed.\n"); exit(0); } else { printf("Memory mapped at address %p.\n", gpio); } […]

gpio_request如何处理Linux上的GPIO号码到虚拟内存地址?

有一个问题,gpio_request需要一个GPIO号码,但是在内核中它需要一个地址来处理gpio,Linux如何实现这个呢? 在芯片规格上,如MSM8x60或任何SOC芯片规格,有一个内存映射显示哪个内存区域为GPIO。 但在内核驱动程序中,我们使用gpio号码来访问gpio。 我的问题是:1,芯片规格内存映射中的内存地址是否是物理地址? 2,在内核中,它使用虚拟地址,内核如何将gpio号码转换为虚拟地址? 谢谢! 亲切的问候Bill Wang

在DeviceTree中命名GPIO

我正在尝试为embedded式系统创build一个设备树,并且想向用户空间公开一些GPIO。 这些不是也不应该被内核驱动程序使用。 例如,有一个USB设备焊接在由用户空间驱动程序控制的电路板上。 它有一个GPIO复位行,用户空间库需要访问。 我希望这些名称暴露在sysfs某处,以便用户空间可以访问/sys/class/gpio/usbreset而不需要知道神奇的gpio号码,并且需要专门“导出”它。 我已经尝试将它设置为一个GPIO猪,它将初始化GPIO,但是它的名字不会出现在sysfs中,并且当它被占用时gpio不能被导出。 我知道我可以select另一种types的内核驱动程序types,如LED,但它不是一个LED,这对我来说似乎不是很干净。 在sysfs中导出一个名为GPIO的正确方法是什么?