- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为什么要读这个?
如果您有Beaglebone Black(BBB),并且想将自己的设备连接到它(而不是斗篷),则可能已经听说过设备树。就我而言,我想将RTC设备连接到BBB上的I2C总线。网络上散布着许多信息,本文旨在总结我所发现的内容,并以此为指导。
因此,我将给出一个激活BBB上的I2C总线以及使用内核中包含的设备驱动程序连接DS1308 RTC芯片的完整示例。听起来不错?
然后继续阅读,如果不清楚,请发表评论。如果您有急事,也可以在Github上获取设备树覆盖代码并飞走。
首先是第一件事。
我在BBB上使用ArchLinux ARM主要是因为Arch Linux很棒,而且我可能太愚蠢而无法使用debianoid发行版。
这是系统的screenfetch。
您可能会注意到内核版本已经高于该3.x版本。在屏幕抓取中看不到的是内核使用Capemgr实用程序支持设备树覆盖。
什么是设备树?
我将快速进行操作,您可以找到更深入的知识here,here,here和here。
设备树是描述平台上基础硬件的结构。它在嵌入式设备中大量使用,因为SOC和其他东西没有像PCI这样的总线可以在其中发现设备。必须静态定义它们,并将它们附加到“平台总线”上,以提供内核附带的设备驱动程序的句柄。
在将设备树引入Linux之前,所有工作都必须使用特定的C头文件和自定义实现来完成,然后将所有这些合并到主线内核中。因此,这是一项可以想象的详尽的工作,它来到了著名的Linus Torvalds rant。在这里,您还有更多device tree background。
是的,但是如何运作?
为了描述设备树,我们使用.dts
(设备树源)文件,这些文件是人类可读的,并由设备树编译器(dtc
)编译为二进制格式的设备树blob(.dtb
)。系统启动时,引导加载程序(例如u-boot)将那个blob移交给内核。内核将对其进行解析并创 build 备树所指定的所有设备。
如果您不相信我,请使用设备树编译器深入了解BBB现在正在使用的设备树。
如果尚未安装,请获取适当的软件包。
pacman -Sy dtc-overlay
dtc -f -I fs /proc/device-tree | less
less
的管道,因为该命令会产生大量输出。结果应如下所示。
<kernel-source>/arch/arm/boot/dts/..
am335x-bone-common.dtsi
am335x-boneblack.dts
am33xx.dtsi
Note: The
.dtsi
files are equivalent to.h
files in C or C++ because they get included (therefore the 'i' at the end) by.dts
files
Note: to be able to compile device tree overlays make sure to install the appropriate package like above (
dtc-overlay
)
/dev
中创建rtc设备。
/dts-v1/;
/plugin/;
/{ /* this is our device tree overlay root node */
compatible = "ti,beaglebone", "ti,beaglebone-black";
part-number = "BBB-I2C1"; // you can choose any name here but it should be memorable
version = "00A0";
fragment@0 {
target = <&am33xx_pinmux>; // this is a link to an already defined node in the device tree, so that node is overlayed with our modification
__overlay__ {
i2c1_pins: pinmux_i2c1_pins {
pinctrl-single,pins = <
0x158 0x72 /* spi0_d1.i2c1_sda */
0x15C 0x72 /* spi0_cs0.i2c1_sdl */
>;
};
};
};
}; /* root node end */
am33xx_pinmux
)中定义的
am33xx.dtsi
设备节点为目标。在该节点内,我们添加了一个新的子节点,称为pinmux_i2c1_pins,该子节点以前不存在(请查看
am335x-bone-common.dtsi
进行验证),并添加标签i2c1_pins。
pinctrl-single
驱动程序控制。要设置特定的引脚,只需使用其相对于基地址的地址偏移量即可(您可以在上面的P9标题表中找到该地址),并将其引脚配置作为第二个参数。
0x72
与
01110010b
等效,因此我们将两个引脚都配置为输入,并具有启用的上拉电阻和复用模式2中的有效转换控制。
/dts-v1/;
/plugin/;
/{ /* this is our device tree overlay root node */
compatible = "ti,beaglebone", "ti,beaglebone-black";
part-number = "BBB-I2C1"; // you can choose any name here but it should be memorable
version = "00A0";
fragment@0 {
target = <&am33xx_pinmux>; // this is a link to an already defined node in the device tree, so that node is overlayed with our modification
__overlay__ {
i2c1_pins: pinmux_i2c1_pins {
pinctrl-single,pins = <
0x158 0x72 /* spi0_d1.i2c1_sda */
0x15C 0x72 /* spi0_cs0.i2c1_sdl */
>;
};
};
};
fragment@1 {
target = <&i2c1>;
__overlay__ {
pinctrl-0 = <&i2c1_pins>;
clock-frequency = <100000>;
status = "okay";
rtc: rtc@68 { /* the real time clock defined as child of the i2c1 bus */
compatible = "dallas,ds1307";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x68>;
};
};
};
}; /* root node end */
ds1307
)和I2C总线上的设备地址(
0x68
)。可以从数据表中获取rtc的I2C地址。
dtc -O dtb -o <filename>-00A0.dtbo -b 0 -@ <filename>.dts
Caution! The filename must be a concatenation of the name you desire plus the version tag as seen above (-00A0) otherwise you'll have a hard time.
.dtbo
文件应该复制到
/lib/firmware
中,我真的不知道“-00A0”命名约定来自何处,但是固件目录中也有其他文件正在使用它。
/sys/devices/platform/bone_capemgr/
中,然后执行。
echo <filename> > slots
.dtbo
文件,并在可能的情况下加载它。通过查看插槽文件,您可以查看该过程是否成功。它应该看起来像这样。
dtc -f -I fs /proc/device-tree | less
/dev/i2c-1
)和一个新的rtc设备(
/dev/rtc1
)。
i2c-tools
并使用。
i2cdetect -r 1
hwclock -r -f /dev/rtc1
/boot/uEnv.txt
并将
bone_capemgr.enable_partno=<filename>
添加到
optargs
语句中。那就是我BBB的样子
optargs=coherent_pool=1M bone_capemgr.enable_partno=bbb-i2c1
part-number
标记。
最佳答案
这是非常有用和有值(value)的信息。我编写了一个i2c内核驱动程序,可以动态加载该驱动程序以与地址0x77的自定义芯片通信。过去,我通过手动实例化设备来成功与芯片进行通信,如下所示:echo act2_chip 0x77> / sys / bus / i2c / devices / i2c-1 / new_device。
实例化设备后,我可以使用i2cdetect工具看到它,并且我的可加载内核驱动程序可以与芯片通信。
现在,我尝试使用设备树方法实例化设备。因此,按照您的指导,我更改了dtsi文件中的一些参数,如下所示:
fragment@1 {
target = <&i2c1>;
__overlay__ {
pinctrl-0 = <&i2c1_pins>;
clock-frequency = <100000>;
status = "okay";
act2_chip: act2_chip@77 { /* the real time clock defined as child of the i2c1 bus */
compatible = "xx,act2_chip";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x77>;
};
关于beagleboneblack - 如何使用设备树覆盖在Beaglebone Black上添加i2c设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549211/
iphone设备UDID、iphone设备ID和iphone设备Token之间有什么区别? 通常,当我们使用苹果推送通知服务时,会使用 iPhone 设备 token 。 但我的目标只是识别唯一的 i
我们使用 firebase 从服务器向 Android 和 IOS 设备发送通知,并且我们使用旧版 FCM 发送通知。但是当我们的应用程序在后台时,通知由系统本身处理,因此我们无法通过应用程序处理它。
在 Google 上搜索后,我发现人们说只能通过“MFi 程序”将 iOS 设备与非 iOS 设备连接起来。这是真的吗? 我的项目主要集中于直接通过蓝牙与Arduino设备发送和接收信息。 iOS和非
所以我有一个通用应用程序,我正在设置 UIScrollView 的内容大小。显然,iPhone 和 iPad 上的内容大小会有所不同。如何为 iPad 设置某种尺寸,为 iPhone 和 iPod t
问题:如何在 pod 中使用连接到主机的原始设备作为 block 设备。 我尝试使用类型为“BlockDevice”的“hostPath” volumes: - my-data: hostPath
Implemented GCKDeviceScannerListener Singleton Class on ViewController, however its delegate methods
我有一个 (PhoneGap) 应用程序,它将成功获得 Passbook 通行证,并且还将成功接收与 Passbook 分开的推送通知(当伪造设备 ID 时)。 我遇到的问题是发送给注册设备的设备 I
我正在尝试找到一种方法,通过我目前正在使用的 iOS 应用程序访问我的信标的电池电量。我正在使用 Kontakt 的 iBeacon 设备。我浏览了 Estimote iOS SDK,他们提供了一种实
我正在努力让 CUDA 应用程序也能监控 GPU 的核心温度。可通过 NVAPI 访问该信息。 问题是我想确保在运行代码时监控的是同一个 GPU。 但是,似乎有信息表明我从 NvAPI_EnumPhy
从沙箱模式到生产模式,设备 token 有何不同? 我认为我已将一些设备 token 锁定为生产模式,并且无法将它们从开发中插入。 关于如何检查有什么想法吗? 最佳答案 当您使用开发证书构建应用程序时
目录 /run/user/1000/gvfs 和 ~/.gvfs 分别是空的和不存在的。我的图形文件管理器 (Thunar) 能够检测和访问设备的内部和外部存储器。 命令 gvfs-mount -l
我有一个 Android 平板电脑,它有一个迷你 USB 端口和一个 USB 端口,我想编写一个与 USB key 通信的应用程序。我写了一个demo来找出U盘,但是没有任何反应。 令我不安的是,如果
我们将 PHP 版本从 5.4.25 更改为 5.4.45,并在服务器上安装了 MS SQL 驱动程序。在更改服务器之前,一切正常,但在更改服务器之后,我遇到了 Web 服务问题。我们的身份验证 So
我想知道是否有人使用此 API 在 Android 设备上同时从 2 个后置摄像头捕获图像或视频:https://source.android.com/docs/core/camera/concurr
我正在为客户构建一个物联网解决方案,网络管理员坚持要求设备仅通过访客网络进行连接,该网络有一个强制门户,其中的服务条款必须通过按下 UI 按钮来接受,然后才能获得外部互联网访问。到目前为止,我见过的大
我无法弄清楚这里的格式规则..在我的示例中,代码行太多,无法为每行添加 4 个空格,因此这里是我需要帮助的代码的链接 http://nitemsg.blogspot.com/2011/01/heres
如果我在我的设备上接受推送通知,并且不保存设备 token ,那么我如何在自定义 View 中查看设备 token 或恢复警报 View ? 我删除了应用程序并重新安装,但看不到设备 token 警报
我试图找出在尝试并行比较和复制设备 block 与 pthreads 时我做错了什么。看起来我正在脱离同步并且比较阶段无法正常工作。任何帮助将不胜感激 #ifndef __dbg_h__ #defin
我刚刚写完所有这些内容,但这个红色的小栏告诉我我不能发布图片或两个以上的链接。因此,如果您可以引用 this Imgur album , 那简直太好了。谢谢。 我在这里相对较新,甚至对 android
我需要启用 mysql 常规日志并将其通过 nsf 移动到我系统中的另一个驱动器/设备! 所以,我在 my.cnf 中启用了它: general_log = 1 general_log_fi
我是一名优秀的程序员,十分优秀!