标签: embedded-linux

如何编译dts Linux设备树源文件到dtb?

我有一个设备树文件(.dts),我想为我的powerpc基板编译文件.

我怎样才能在我的机器上进行,这不是基于powerpc的?我可以使用我的Ubuntu系统上安装的DTC吗?或者更像是使用单独的编译器并传递ARCH信息(比如使用工具链)?

powerpc cross-compiling linux-kernel embedded-linux device-tree

36
推荐指数
3
解决办法
5万
查看次数

交叉编译内核模块

我正在尝试在我的intel x86主机上为ARM体系结构交叉编译helloworld内核(2.6.x)模块.

ARM的代码源工具链位于:/ home/ravi/workspace/hawk/arm-2009q3

内核源代码位于:/ home/ravi/workspace/hawk/linux-omapl1

我的Makefile:

ARCH=arm
CROSS_COMPILE=arm-none-linux-gnueabi
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(shell pwd)
default:
          $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
          $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

当我运行make时,.ko生成的是我的主机,这意味着makefile正在调用本机编译器而不是交叉编译器.我做错了什么?交叉编译器的二进制文件在我的路径中.

makefile cross-compiling kernel-module embedded-linux linux-toolchain

31
推荐指数
4
解决办法
7万
查看次数

用户空间与内核空间驱动程序

我正在寻找一个PWM驱动程序.我知道有两种方法可以控制硬件驱动程序:

  1. 用户空间驱动程序
  2. 内核空间驱动程序

如果一般(不考虑PWM驱动程序的情况),我们必须决定是去用户空间还是内核空间驱动程序.那么除了这些因素我们还要考虑哪些因素?

  1. 用户空间驱动程序可以直接将mmap()/ dev/mem内存存储到其虚拟地址空间,无需上下文切换.
  2. 用户空间驱动程序不能实现中断处理程序(它们必须轮询中断).
  3. 用户空间驱动程序无法执行DMA(因为可以从内核空间分配具有DMA功能的内存).

linux linux-device-driver linux-kernel embedded-linux

30
推荐指数
2
解决办法
2万
查看次数

通过/ dev/mem驱动Beaglebone GPIO

我正在尝试编写一个用于在Beaglebone上闪烁LED的C程序.我知道我可以使用sysfs方式......但是我想看看是否可以使用/ dev/mem获得与物理地址空间映射相同的结果.

我有一个头文件,beaglebone_gpio.h,内容如下:

#ifndef _BEAGLEBONE_GPIO_H_
#define _BEAGLEBONE_GPIO_H_

#define GPIO1_START_ADDR 0x4804C000
#define GPIO1_END_ADDR 0x4804DFFF
#define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR)
#define GPIO_OE 0x134
#define GPIO_SETDATAOUT 0x194
#define GPIO_CLEARDATAOUT 0x190

#define USR0_LED (1<<21)
#define USR1_LED (1<<22)
#define USR2_LED (1<<23)
#define USR3_LED (1<<24)

#endif
Run Code Online (Sandbox Code Playgroud)

然后我有我的C程序,gpiotest.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h> 
#include "beaglebone_gpio.h"

int main(int argc, char *argv[]) {
    volatile void *gpio_addr = NULL;
    volatile unsigned int *gpio_oe_addr = NULL;
    volatile unsigned int *gpio_setdataout_addr = NULL;
    volatile unsigned int *gpio_cleardataout_addr …
Run Code Online (Sandbox Code Playgroud)

embedded mmap embedded-linux gpio

28
推荐指数
3
解决办法
3万
查看次数

列出linux系统中的所有硬盘

我在检测哪个块设备是硬盘时遇到问题.我的系统有一个CD-ROM驱动器,USB驱动器和一个未知供应商/类型的单个硬盘驱动器.

如何使用linux命令,脚本或C应用程序识别硬盘?

linux linux-kernel embedded-linux

25
推荐指数
2
解决办法
5万
查看次数

编写一个bash shell脚本,在用户定义的时间内消耗一定量的RAM

我正在尝试编写一个bash shell脚本,该脚本在用户定义的时间内在嵌入式设备上消耗大量RAM.如何在不使用数组的情况下执行此操作?

linux bash shell embedded-linux

24
推荐指数
1
解决办法
3万
查看次数

学习嵌入式linux的技巧

我想学习嵌入式linux的基础知识.要做到这一点,我假设我需要购买某种硬件板并拥有linux内核代码.

我不知道从哪里开始这个,任何提示/指针都是最受欢迎的.理想情况下,我希望人们指出一个完整的系统(例如这个"带有linux的电路板套件",这些"手册"非常好).

成本也是一个因素,因为我个人而不是作为一个企业:)

非常感谢Code

starter-kits linux-kernel embedded-linux

24
推荐指数
3
解决办法
2万
查看次数

跟踪内核中神秘的高优先级线程挂起

描述

我正在研究一个在多核ARMv7a SoC上运行的嵌入式Linux系统(使用内核3.4和仿生,类似Android).我们有一个用户空间线程,它基本上处理来自内核的事件.事件是从IRQ生成的,必须以非常低的延迟对用户空间做出反应.

线程以SCHED_FIFO优先级0运行.它是系统中唯一的优先级0线程.线程的近似代码:

    while (1)
    {
        struct pollfd fds[1];
        fds[0].fd = fd;
        fds[0].events = POLLIN|POLLRDNORM|POLLPRI;

        int ret = poll(fds, 1, reallyLongTimeout);
        FTRACE("poll() exit");
        if (ret > 0)
        {
            // notify worker threads of pending events
        }
    }
Run Code Online (Sandbox Code Playgroud)

通常我们会得到非常好的延迟(线程在IRQ发生的同一毫秒内完全往返于poll()),然而随机我们有几十毫秒的延迟会破坏一切.在遍历整个地方之后,我得出结论,延迟发生在IRQ触发之后和poll()系统调用返回之前,因为线程使自己处于睡眠状态.然后一段时间后被一些未知的力量唤醒,一切都继续.

我怀疑其他一些IRQ但是在启用了sched:,irq : , timer:*tracing我不得不排除它.我在移植系统调用时遇到了一些困难:*跟踪器到ARM内核.系统调用跟踪器工作,但如果我也启用sched:*我在ring_buffer代码中得到各种各样的恐慌.

在sys_poll()中插入一些自定义跟踪点之后,我得到了一个令人不舒服的结论,即我的线程在sys_poll()返回之后但在它重新出现在用户空间之前就已经睡着了.

这是带有我在fs/select.c中的自定义跟踪点的带注释的跟踪:

 <my thread>-915   [001] ...1    17.589394: custom: do_poll:786 - calling do_pollfd
 <my thread>-915   [001] ...1    17.589399: custom: do_poll:794 - failed, no events
 <my thread>-915   [001] ...1    17.589402: custom: do_poll:823 - going to sleep, count = …
Run Code Online (Sandbox Code Playgroud)

multithreading multicore linux-kernel embedded-linux low-latency

24
推荐指数
2
解决办法
1439
查看次数

request_mem_region()实际上做什么以及何时需要它?

我正在研究编写嵌入式Linux驱动程序,并决定开发一些GPIO以确保我正确理解本书(LDD3,第9.4.1节).

我可以按照预期控制正确的GPIO引脚(使其高低,我用万用表探测); 但是,我测试了2个代码,一个有request_mem_region(),一个没有.我期待一个没有失败的人,但两个都工作得很好.

代码request_mem_region:

if( request_mem_region( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF,DEVICE_NAME ) == NULL )
  {
    printk( KERN_ALERT
            "GPIO_140_141_conf_phys error:%s: unable to obtain I/O memory address 0x%08llX\n",
            DEVICE_NAME, PIN3_CONF_PHYS );

    return -EBUSY;
  }

pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
//-----------------------------------------------------------------
if( request_mem_region( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5,DEVICE_NAME ) == NULL )
  {
    printk( KERN_ALERT
            "error:%s: unable to obtain I/O memory address 0x%08llX\n",
            DEVICE_NAME, GPIO_BANK5_PHYS );

    return …
Run Code Online (Sandbox Code Playgroud)

c linux-device-driver linux-kernel embedded-linux

23
推荐指数
2
解决办法
2万
查看次数

2038年嵌入式Linux(32位)解决方案?

在3238嵌入式Linux(ARMLinux)的C代码中处理时间的正确方法是什么,以确保代码在2038年1月19日03:14:07 UTC之后继续正常工作(当有符号的32位time_t溢出时)?鉴于time_t在我必须使用的系统上签名32位,有哪些替代方案?

大量的谷歌搜索没有发现任何实际用途.每个人似乎都认为到那时我们都将使用64位操作系统,但这显然不适用于嵌入式系统.

在我需要使用的系统上,__kernel_time_t定义为a long.这可能意味着64位时间没有内核工具.uClibc的版本是0.9.29.

我不敢相信我是唯一有这个问题的人,我不想重新发明轮子.

c 32-bit uclibc embedded-linux year2038

23
推荐指数
2
解决办法
3294
查看次数