标签: embedded-linux

Linux上的I2C并发访问,互斥

我正在嵌入式Linux中编写一个多线程C程序,从用户空间访问许多I2C设备(从设备).此外,我从多个线程访问相同的I2C设备.我正在使用SMBUS函数(i2c_smbus_write_byte_data,i2c_smbus_read_byte_data,i2c_smbus_read_i2c_block_data,...).

是否有内置并发访问的保护或我是否需要自己添加互斥?

例如:我有一个读取功能,通过I2C读取一个传感器的数据.但是也可以从另一个线程调用相同的函数,从而导致可能的并发访问.我是否必须在该函数中使用某些静态互斥锁,或者它是否已经在I2C访问函数中?

linux concurrency mutex i2c embedded-linux

7
推荐指数
2
解决办法
4091
查看次数

在Linux下获取缓冲区的物理地址

我正在Xilinx的Microblaze上运行带有完整MMU的Linux内核3.3.我正在做的任务要求我知道以下内容:我需要创建一个文本文件(缓冲区)并找到该缓冲区的物理地址,我不希望内核将此文件写入不连续的内存区域.

我需要这个的原因是因为我有一个DMA引擎从预设的物理内存地址流式传输数据,所以我需要强制Linux在那个确切的内存位置创建缓冲区文件,以便当我将数据写入此文件时立即传输由DMA引擎到另一个硬件核心

更多细节:

我的系统有一个512 MB DDR3 RAM通过"Xilinx"多端口内存控制器(MPMC)连接到系统.该内存控制器的基地址为0x90000000,系统中的所有单元通过该控制器访问内存,包括MicroBlaze,DMA我所使用的单元使用称为本机个性化接口(NPI)的特殊接口,以非常低的级别与存储器通信,从而产生非常高的速度性能.

这个NPI DMA单元最初设计用于一个名为"xilkernel"的非常基本的嵌入式内核,它不支持虚拟内存,MMU也不是MicroBlaze的一部分,因此程序员可以看到操作系统代码所在的位置并选择物理内存地址如0x91800000作为DMA将从中流出的源地址,然后程序员可以将文件放在该确切的地址中并运行系统

当我们需要迁移项目以使用Linux而不是xilkernel时我们遇到了这个问题,我在外部存储设备上有文件,我可以从Linux访问作为块设备,我需要将每个文件移动到主内存(DDR3 RAM)并使DMA流成为文件.目前来自固定地址的DMA流,但如果需要,我可以使它成为通用的.

embedded mmap linux-kernel embedded-linux microblaze

7
推荐指数
2
解决办法
3266
查看次数

使用RNDADDENTROPY将熵添加到/ dev/random

我有一个设备会产生一些噪音,我想将它添加到嵌入式Linux系统中/ dev/random设备的熵池中.

我正在阅读/ dev/random上手册页,我真的不明白你传递给RNDADDENTROPY ioctl调用的结构.

   RNDADDENTROPY
          Add some additional entropy to the input pool, incrementing
          the entropy count.  This differs from writing to /dev/random
          or /dev/urandom, which only adds some data but does not
          increment the entropy count.  The following structure is used:

              struct rand_pool_info {
                  int    entropy_count;
                  int    buf_size;
                  __u32  buf[0];
              };

          Here entropy_count is the value added to (or subtracted from)
          the entropy count, and buf is the buffer of size buf_size
          which gets …
Run Code Online (Sandbox Code Playgroud)

c linux ioctl embedded-linux

7
推荐指数
1
解决办法
3315
查看次数

为什么i2cdetect总是在嵌入式Linux上的RTC上提供UU

我想用C代码而不是"hwclock"shell命令从RTC传递读取信息.

但是,当我使用时i2cdetect,它显示0x68(这是我的RTC从站地址)具有状态"UU",这意味着"跳过了探测,因为该地址当前正由驱动程序使用".在我尝试之后i2cget,它的givng"可能会将地址设置为0x68:设备或资源忙".

所以我在想我的Linux内核是否存在一些问题,它会一直强制从我的RTC读取,或者其他一些原因.

谢谢

linux i2c linux-device-driver embedded-linux

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

从内核空间关闭(嵌入)linux

我正在为基于ARM9的平台Olinuxino开发2.6.35内核的修改版本.我正在尝试修改电源管理驱动程序(特定于体系结构的部分).

处理器是飞思卡尔i.MX23.该处理器有一个称为PSWITCH的"特殊"引脚,用于触发由电源管理驱动程序处理的中断.如果按下开关,系统将进入待机状态.这是通过调用在驱动程序中完成的pm_suspend(PM_SUSPEND_STANDBY).

鉴于我的硬件设置,我想关闭系统.所以我的问题是:

内核空间进程触发干净系统暂停/关闭的首选方法是什么?

我想那里有一个很好的小函数调用,但到目前为止我找不到它.

我的内核代码(我正在处理的文件是arch/arm/mach-mx23/pm.c)可以在这里找到:github.com/spairal/linux-for-lobster,虽然我的问题需要一个通用的Linux内核做法.

linux linux-kernel embedded-linux

7
推荐指数
1
解决办法
4642
查看次数

什么是dbus守护进程以及为什么vlc需要它

我使用buildroot交叉编译VLC(版本2.1.2)媒体播放器用于扶手板.我已经使用串行电缆将电路板连接到我的linux PC.当我尝试在minicom中使用"vlc"命令运行播放器时,该命令位于我的根文件系统的/ usr/bin中.我收到以下错误:

禁止接口错误:无法连接到D-Bus会话守护程序:/ usr/bin/dbus-launch异常终止,出现以下错误:自动启动错误:X11初始化失败.

任何人都可以澄清这个错误的含义,也可以告诉我什么是dbus以及为什么我的VLC播放器需要它.

谢谢你的帮助.

linux x11 dbus embedded-linux buildroot

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

arecord创建的多个文件

我使用buildroot进行自定义分发,使用ARMv7处理器的硬流程.一切正常,除了....

# arecord -D hw:0,0 -fdat -d 5 test.wav
Run Code Online (Sandbox Code Playgroud)

这会产生多个文件.成千上万的人.

-rw-r--r--    1 root     root        958508 Jan  1 00:19 test-01.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-02.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-03.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-04.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-05.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-06.wav
-rw-r--r--    1 root     root            44 Jan  1 00:19 test-07.wav
-rw-r--r--    1 root     root            44 Jan  1 …
Run Code Online (Sandbox Code Playgroud)

audio alsa embedded-linux buildroot

7
推荐指数
2
解决办法
2288
查看次数

挥发性及其有害影响

我是嵌入式开发人员,在使用I/O端口时使用volatile关键字.但我的项目经理建议使用volatile关键字是有害的并且有很多缺点,但我发现在大多数情况下volatile在嵌入式编程中很有用,据我所知,volatile在内核代码中是有害的,因为我们代码的更改将变为不可预知的.嵌入式系统中使用volatile还有什么缺点吗?

c embedded linux-kernel embedded-linux

7
推荐指数
3
解决办法
973
查看次数

NFS rootfs上的Busybox SUID

我正在从底部为Beagle Bone板构建一个Linux系统.我编译了vanilla内核并构建了一个基本的根文件系统busybox.系统使用U-boot启动,而rootfs它位于Linux PC上并通过NFS导出:

/path/to/rootfs  10.42.0.17(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
Run Code Online (Sandbox Code Playgroud)

U-boot bootargs是:

bootargs console=ttyO0,115200n8 root=/dev/nfs rw nfsroot=${serverip}:/path/to/rootfs,v3,tcp ip=dhcp
Run Code Online (Sandbox Code Playgroud)

我在尝试su为非root用户工作时遇到了问题.为了解决这个问题,互联网上的人们建议设置二进制suidbusybox.这样做之后:

$ sudo chmod u+s busybox 
Run Code Online (Sandbox Code Playgroud)

并验证:

$ ls -la
...
-rwsr-xr-x  1 myuser myuser 1882976 Jan 13 21:47 busybox
...

$ stat -c "%a %n" busybox 
4755 busybox
Run Code Online (Sandbox Code Playgroud)

有些不对劲.内核正在启动并显示所有常用消息,但最后会卡住,并且不会login显示任何行.以下是启动顺序的最后几行:

[    3.776185] IP-Config: Complete:
[    3.779656]      device=eth0, hwaddr=c8:a0:30:c5:80:e9, ipaddr=10.42.0.17, mask=255.255.255.0, gw=10.42.0.1
[    3.789877]      host=10.42.0.17, domain=, nis-domain=(none)
[    3.795822]      bootserver=10.42.0.1, rootserver=10.42.0.1, rootpath=
[    3.802492]      nameserver0=10.42.0.1 …
Run Code Online (Sandbox Code Playgroud)

linux boot nfs rootfs embedded-linux

7
推荐指数
1
解决办法
539
查看次数

如何将文件操作附加到平台驱动程序中的sysfs属性?

我为我们开发的外围设备编写了一个平台驱动程序,并希望向sysfs公开一些配置选项.我已设法使用属性结构(见下文)和sysfs_create_file探测函数创建适当的文件,但我无法弄清楚如何将show/store函数附加到平台驱动程序中的结构.

我在网上找到的大多数资源使用了一个device_attribute结构或类似的东西来创建他们的文件,这也适合吗?还有另一种方法可以为平台驱动程序执行此操作吗?

我的属性struct看起来像这样:

struct attribute subkey_attr = {
    .name = "subkeys",
    .mode = S_IWUGO | S_IRUGO,
};
Run Code Online (Sandbox Code Playgroud)

我使用此调用注册该文件:

riddler_kobject = &pdev->dev.kobj;
ret_val = sysfs_create_file(riddler_kobject, &subkey_attr);
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
2
解决办法
5806
查看次数