这次动手想给自己的BBB做一个RTCcape,让自己的板子可以每次开机记住时间。简单来说划分成三个任务:

1,搭建一个RTC硬件电路,这个有较多资料可以参考,比如官方的cape中就有http://elinux.org/CircuitCo:RTC_Cape。

2,需要一个设备树文件,既然是插上就能使用的 cape ,那么必须由设备树文件来绑定内核中和RTC硬件电路相对应的驱动程序,通过底层驱动外露出来的接口,我们的应用程序才能驱动硬件。

3,仅仅设备树文件还不能完成任务,还需写一个简单的脚本(这个就相当于我们的应用程序吧),让每次开机脚本自动把DS1338中的时间更新到系统时间。

第一步就是参考别人的硬件电路,然而抄完电路发现别人DS1338芯片的I2C接口是接在BBB的I2C1总线上,而我的电路却焊接到了I2C2总线上,于是有了这个修改设备树文件的变故。

注意此处的cape和通常所说的cape有一点点不一样,就是他没有用eeprom。通常对于cape的描述是一插上后板子上电就能用,这是因为位于0x54-0x57地址的eeprom告诉了系统启动时该对哪几个overlay进行重载,从而开机后系统就识别出了硬件。而这里没有eeprom的情况下,我通过修改uEnv.txt,让系统开机后就加载对应的dtbo文件,同样达到了这个目的。

从上面的链接把他配套的设备树文件下载过来,打开源码如下:

* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. /dts-v1/; /plugin/; compatible = "ti,beaglebone", "ti,beaglebone-black"; /* identification */ part-number = "BBB-RTC-01"; version = "00A1"; /* state the resources this cape uses */ exclusive-use = /* the pin header uses */ "P8.26", /* rtc: gpio1_29 */ "P9.18", /* i2c1_sda */ "P9.17", /* i2c1_scl */ /* the hardware ip uses */ "gpio1_29", "i2c1"; fragment@0 { target = <&am33xx_pinmux>; __overlay__ { rtc_mfp: pinmux_rtc_mfp { pinctrl-single,pins = < 0x07c 0x3f /* gpmc_csn0.gpio1_29, INPUT | PULLDIS | MODE 7 */ bb_i2c1_pins: pinmux_bb_i2c1_pins { pinctrl-single,pins = < 0x158 0x72 /* spi0_d1.i2c1_sda, SLEWCTRL_SLOW | INPUT_PULLUP | MODE2 */ 0x15c 0x72 /* spi0_cs0.i2c1_scl, SLEWCTRL_SLOW | INPUT_PULLUP | MODE2 */ fragment@1 { target = <&ocp>; __overlay__ { rtc_helper { status = "okay"; compatible = "bone-pinmux-helper"; pinctrl-names = "default"; pinctrl-0 = <&rtc_mfp>; fragment@2 { target = <&i2c1>; __overlay__ { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&bb_i2c1_pins>; /* this is the configuration part */ clock-frequency = <100000>; /* shut up DTC warnings */ #address-cells = <1>; #size-cells = <0>; /* MCP79410 RTC module */ rtc@68 { compatible = "maxim,ds1338"; reg = <0x68>;

接下来根据自己的情况对文件进行修改,如下:

* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. /dts-v1/; /plugin/; compatible = "ti,beaglebone", "ti,beaglebone-black"; /* identification */ part-number = "BBB-RTC-ZY"; version = "00A0"; /* state the resources this cape uses */ exclusive-use = /* the pin header uses */ "P8.26", /* rtc: gpio1_29 */ "P9.20", /* i2c2_sda */ "P9.19", /* i2c2_scl */ /* the hardware ip uses */ "gpio1_29", "i2c2"; fragment@0 { target = <&am33xx_pinmux>; __overlay__ { rtc_mfp: pinmux_rtc_mfp { pinctrl-single,pins = < 0x07c 0x3f /* gpmc_csn0.gpio1_29, INPUT | PULLDIS | MODE 7 */ bb_i2c2_pins: pinmux_bb_i2c2_pins { pinctrl-single,pins = < 0x178 0x73 /* spi0_d1.i2c1_sda, SLEWCTRL_SLOW | INPUT_PULLUP | MODE3 */ 0x17c 0x73 /* spi0_cs0.i2c1_scl, SLEWCTRL_SLOW | INPUT_PULLUP | MODE3 */ fragment@1 { target = <&ocp>; __overlay__ { rtc_helper { status = "okay"; compatible = "bone-pinmux-helper"; pinctrl-names = "default"; pinctrl-0 = <&rtc_mfp>; fragment@2 { target = <&i2c2>; __overlay__ { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&bb_i2c2_pins>; /* this is the configuration part */ clock-frequency = <100000>; /* shut up DTC warnings */ #address-cells = <1>; #size-cells = <0>; /* MCP79410 RTC module */ rtc@68 { compatible = "maxim,ds1338"; reg = <0x68>;

23:一棵设备树的根节点

25:描述本设备树重载文件应用的平台,第一个字符串描述的平台是最匹配的,第二个其次....

29-33:part-number用于在不同的插件对应的设备树重载文件之间区别,version用于在同一个插件的不同版本之间进行区别,这样能保证不会弄错文件文件名字根据这两个信息进行命名,进一步保证不出错。此处我将名字修改了一下,那么待会儿文件名也最好相应改一下。

37-51:此处exclusive-use属性(顾名思义专用属性)描述插件所需要的资源,主要是引脚资源,这些资源不应该被分配给其他作用。修改之前此处是i2c1的引脚,现在根据自己的电路查看下表修改为i2c2引脚,另外一个gpio1_29是因为ds1338有一个可以输出方波频率为1K、4K、8K、32K的SQW引脚,该引脚接在GPIO61上,61 = 32 * 1 + 29

,此引脚不需要修改。

55-69:第0段代码fragment交代了其目标:pinmux引脚映射,__overlay__则是一个节点,节点的第一个子节点pinmux_rtc_mfp前面有一个代号rtc_mfp,这个代号是为了方便后面的代码段进行引用。 节点pinmux_rtc_mfp的属性pinctrl-single,pins其值为0x07c 0x3f,第一个值表示我们想要的引脚gpio1_29,查下图可知在系统中其名字为0x07c,而0x3f = 0011 1111,其各个位所代表的意义如下下图(摘自4000+页的技术手册)所示。该引脚配置为MODE7即GPIO口模式,输入上拉下拉禁能(外部已经有焊接了上拉电阻),接收使能,快速。该属性和值的相关配置是由系统中的引脚复用配置驱动程序pinctrl-single 来处理的。

73-85:作为__overlay__的第二个子节点,其代号被修改为bb_i2c2_pins,节点名称也被修改为pinmux_bb_i2c2_pins,其属性 pinctrl-single,pins的值毫无疑问也是对i2c2_scl和i2c2_sda进行配置,查询方法如第1、3张图所示。

91-113:这一段代码段引用了第0段代码段的一个子节点,与gpio1_29的配置相关。

117-161:这一段代码代码段可能是提供了一些配置驱动程序的信息,用于配置i2c通信的一些相关参数。

设备树文件的编写最好拿最相近的设备树文件来改写。

修改完设备树文件命名为XX-00A0.dts,将其传到BBB板子上,通过系统中的dtc -I dts -O dtb -o xx-0A00.dtbo -@ filepath/XX-00A0.dts命令来编译得到 XX-00A0.dtbo文件,将此文件复制到/lib/firmware目录。同时在uEnv.txt文件中添加如下语句,

蓝色框内表示开机自动禁止重载的内容,红线表示开机自动重载的内容。 此处注意,事实上所有我们自己改写的设备树文件名不能随便乱取,否则系统无法接受,开机后重载失败,我采取的方法是通过同名覆盖掉原来的BB-BONE-RTC-00A0.dtbo,这样开机后就能自动重载了。貌似这是一个bug?本人采用的系统来自官方的最新的debian,内核版本3.8.13。

这样做了之后,每次开机系统会通过设备树重载文件找到驱动程序,这个驱动程序操作的硬件就是我们的DS1338了,而驱动程序外露出的接口就是/dev/rtc1,只要我们通过应用程序对这个设备文件操作就行。

开机自动运行程序 一文中可以看到如何让应用程序在每次开机后自动的把DS1338里面的时间更新到系统时间! 吐舌头

最近想给自己的BBB做一个RTCcape,让自己的板子可以记住时间,简单说来划分成三个任务:1,搭建一个RTC硬件电路,这个有较多资料可以参考,比如官方的cape中就有http://elinux.org/CircuitCo:RTC_Cape。2,需要一个设备树文件,既然是插上就能使用的cape,那么必须由设备树文件来绑定和RTC硬件电路相对应的驱动程序。3,仅仅设备树文件还不能完成
1 设备树 的引入与作用 以 LED 驱动为例,如果你要更换 LED 所用的 GPIO 引脚, 需要 修改 驱动程序源码、 重新 编译 驱动、 重新 加载驱动。在内核中,使用同一个芯片的板子,它们所用的外设资源不一样,比如 A 板用 GPIO A,B 板用 GPIO B。而 GPIO 的驱动程序既支持 GPIO A 也支持 GPIO B,你 需要 指定使用哪一个引脚,怎么指定?在 c 代码中指定。 随着 ARM 芯片的流行,内核中针对这些 ARM 板保存有大量的、没有技术含量的 文件 。Linus 大发雷霆:“this whole
1. 修改 顶层makefile 接在顶层 Makefile 文件 里面定义 ARCH 和 CROSS_COMPILE 这两个的变量值为 arm 和 arm-linux-gnueabihf- ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf- 2.配置并 编译 Linux 内核 和 uboot 一样,在 编译 Linux 内核之前要先配置 Linux 内...
设备树 加载方法 替换 设备树 有下面几种方法。 第一种,简单直接, 设备树 是在 编译 到内核中的,所以 重新 烧写内核这种方式肯定可行。但是烧写内核比较麻烦,可以参考制作系统镜像系列章节。不推荐也不做过多的讲解。 第二种,将我们 编译 好的 设备树 或者 设备树 插件替换掉开发板里面原有的。 我们只介绍第二种,将 编译 好的新 设备树 文件 ,替换开发板 /usr/lib/linux-image-4.19.35-imx6/ 目录下的旧 设备树 文件 即可。 1、note:由于ubantu和开发板的Linux内核版本都是4.19.35,所以 编译 设备树
这里使用的是天嵌的IMX6UL,内核版本4.1.15 以下以LCD_DATA23(54引脚)为例介绍 将被驱动占用的管脚, 修改 成GPIO 1.在 imx6q-pinfunc.h 文件 中搜索LCD_DATA23 搜索结果如下: 从图片可以看出LCD_DATA23是LCDIF_DATA23管脚 2. 打开 arch/arm/boot/dts/目录下的tq-imx6ul.dts 搜索LCD_...
本次项目的开发想要去实现一个双路的串口转以太网的功能,实验的平台是 野火的 imx.6ull pro 。 使用的sdk 是韦东山老师提供的sdk ,系统使用buildroot 编译 生成。 需要 修改 的是这个 文件 arch/arm/boot/dts/imx6ull-14x14-ebf.dts 仿照串口2的配置 修改 了串口三的配置 pinctrl_uart3: uart3grp { fsl,pins = < MX6UL_PAD_UART3_TX_DATA__UART3_DTE_RX
Jetson TX2刷机后USB无法使用 解决方案 Jetson TX2 修改 设备树 在非公版TX2刷机后可能出现无法使用USB的问题,这是由于官方的底板上采用INA3221芯片做了电源监控电路,只有确保5V电源达到要求的情况下才会使能USB口。而新做的板子上将上述电路省略了,所以导致了USB口无法使用。解决办法就是要给TX2更新 设备树 。 安装Jetpack 为了更新 设备树 ,首先要在PC机上安装Je...
设备树 (DeviceTree)是用来保存系统的是设备信息,用于系统启动时,OS可以通过解析 设备树 信息,加载对应的设备资源(包括但加载驱动和设置关键设备参数)。 设备树 的出现,解决了硬件资源被写死在代码里,每次变更都 需要 重新 编译 镜像的尴尬场景。采用 设备树 之后 ,可以通过 修改 设备树 内容,动态加载对应设备,而不 需要 重新 编译 镜像。 通常我们 修改 设备树 的扩展名为dts或dtsi,它是文本 文件 ,记事本就可以打开。 设备树 文件 我上传...
对于您的问题,我可以为您提供以下推荐的开发板: 1. Raspberry Pi:这是一款广受欢迎的开发板,它有着强大的社区支持和大量的文档和教程,适合学习各种嵌入式开发技术,包括 设备树 驱动。 2. BeagleBone Black :这是另一个流行的开发板,它有着类似于Raspberry Pi的社区支持和大量的文档和教程,可以帮助您学习 设备树 驱动的开发。 3. Banana Pi:这是一款基于ARM架构的开发板,它可以运行类似于Raspberry Pi的操作系统,同时具有更多的GPIO和外设接口,适合于学习 设备树 驱动的开发。 需要 注意的是, 设备树 驱动是一项高级的嵌入式开发技术, 需要 具备一定的基础知识和经验,如果您是初学者,可能 需要 先学习一些基础的嵌入式开发知识和编程技巧,再逐步深入学习 设备树 驱动的开发。
Beaglebone Black——实践篇beaglebone black启动——从串口获得SPL、U-BOOT,TFTP服务器获得内核,NFS服务器挂载根文件系统 StephenZhen: 请问一下博主,遇到了和楼上一样的问题,是什么原因啊可能, walter7777码龄13年 请教博主,我按照你的步骤,通过串口Xmoden协议传送SPL文件, 为何一直是0% 0 KB 0 bytes/sec 00:00:00 ETA 716 Errors,感觉哪里没有配置好么,还是没有连接VCC 的原因 ,呢么哪一个PIN 又是VCC呢,希望博主帮忙 Beaglebone Black——实践篇beaglebone black启动——从串口获得SPL、U-BOOT,TFTP服务器获得内核,NFS服务器挂载根文件系统 不万能的slowby: 想问下那个密码是多少啊 ubuntu12.04下在Eclipse中搭建BeagleBoneBlack的开发环境——远程在线运行&调试 pluto_wch: 作者您好,我在编译testc的时候出现了一个下面的错误: Error: Program "make" not found in PATH PATH=[/usr/lib/jdk1.8.0_211/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin] 希望您能帮助一下,我的邮箱是1529055233@qq.com 期待您的回复 谢谢您 WIN7下Qt4.8.6静态编译 zy812248258 「已注销」: 有兴趣,可以加qq 812248258联系吗? WIN7下Qt4.8.6静态编译 「已注销」: 请问您有兴趣做 基于Ti Sitara AM5708的板子评测吗?