成功搭载ubuntu了,所以接下来要编写设备树了。
之后再运用外设。
设备树
【zynq和fmql的设备树编写方式、语法等是一样的吗】
设备树要修改system-user.dtsi文件,目录如下:
fmsh-psoc.dtsi中有很多外设的信息,但都是disable:
对于要用到的外设,在system-user.dtsi中,把status改成“okay”即可。
https://www.cnblogs.com/han-guang-xue/p/16115559.html
pl.dtsi文件是和vivado工程对应的PL端资源:
详细说明:
关于ZYNQ搭载嵌入式操作系统_zynq phy挂载-CSDN博客
尝试修改
- 为什么不能include fmsh-psoc.dtsi?(该文件是fmql的PS资源设备树配置)
引用之后:
(换成#include也不行)
难道要在system-user.dtsi里重新写一遍? ——不需要
或者直接在fmsh-psoc.dtsi里修改? ——不建议
- 把fmsh-psoc.dtsi内容全cpoy到system-user.dtsi里,然后只把uart1的status改成okay。
(其实并不需要这样做)
PS端包括:(所需)global timer,gmac0,qspi flash0(内存可能需要修改),can0,uart0,uart1,SD,iic(模拟iic),watchdog,ttc0,
PL端包括:(可能全部需要自己写?)uart16550,bram,etc。
sysmon和intr呢?
---PL端也不需要自己写,都在pl.dtsi里面。
PL端dtsi生成:https://m.eeworld.com.cn/bbs_thread-1131007-1-1.html
那么问题来了,fmsh-psoc.dtsi里全部都是status = "disabled"
要修改system-user.dtsi还是直接修改fmsh-psoc.dtsi?
以及是否可以 /include/ "pl.dtsi"
(PL端的引脚配置需不需要?)
【以上内容是本人最开始接触设备树的想法,经过几天的信息收集,已经不这么想了】
gmac
修改mac地址:(前面加0x的话就会报错)
驱动程序
.h文件位置:
Linux驱动入门——编写第一个驱动_linux怎么写驱动-CSDN博客
设备树语法:
i2c
模拟iic(官方有pdf教程)(看教程是很简单的事情,但是也花了我两三天时间)
.dtsi中添加以下内容:
// i2c - gpio
i2c_gpio0: i2c-gpio-0{
compatible = "i2c-gpio";
/*MIO56-SDA, MIO55-SCL*/
gpios = <&portc 2 0
&portc 1 0 >;
status = "okay";
i2c-gpio,delay-us = <5>; // 100k Hz
#address-cells = <1>;
#size-cells = <0>;
rtc@68 {
compatible = "nxp, ds3231";
reg = <0x68>; //ID
status = "okay";
}
}
发现了,报错的原因是两个"}"后面都没有";"
kernel编译已经有了:
但是还是不行:
难道是kernel还没配置好?
看了一下官方pdf,用的是MIO48、49。而我们的电路板用的是MIO55、56,是EMIO了,所以是不是还要配置为EMIO?
看看怎么配置。
试试看:我使用过的Linux命令之hwclock - 查询和设置硬件时钟 - Bash @ Linux - ITeye博客
https://www.cnblogs.com/taosim/articles/3287490.html
iic:
Linux内核驱动:gpio模拟i2c驱动_i2c-gpio-CSDN博客
可行:
但是每次断电启动后都需要再配置吗,还是以后就不需要了?
hwclock是否可用?
https://www.cnblogs.com/schips/p/xilinx_zynq_linux_config_rtc_with_dts.html
把.dtsi里面的rtc也改成"dallas,ds3231"试试:没用。
找linux源码目录下的.txt文件(绑定文档)
发现rtc的cpmoatible属性写错了,应该写"maxim,ds3231"而不是"nxp, ds3231"(中间不能有空格)
改了之后还是不行,发现kernel:
只有i2c-gpio,没有rtc
因为IO给的value是1,改成0:
可以了!(为什么是ds1307而不是ds3231?)
总结
1.修改设备树(system-user.dtsi,切记勿修改fmsh-psoc.dtsi)
/{
i2c_gpio0: i2c-gpio-0 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "i2c-gpio";
// MIO56-SDA, MIO55-SCL
gpios = <&portc 2 0
&portc 1 0 >;
status = "okay";
i2c-gpio,delay-us = <5>; // 100k Hz
rtc@68 {
compatible = "maxim,ds3231";
reg = <0x68>; //ID
status = "okay";
};
};
};
i2c-gpio的引脚要和原理图对上;rtc的compatible要和内核文件信息对上(厂商和芯片型号) (中间不能有空格)
2.kernel启动信息中是否有i2c-gpio和rtc的相关驱动信息
3.ubuntu启动后,输入命令,设置时间
4.rtc芯片的compatible信息,找了好久都没有找到内核文件中正确的写法(因此才会写成dallas, ds3231中间还有空格—__—)
硬件信息在linux源码下:
gpio
root登录后:
cd /sys/class/gpio GPIO部分
ls -l 看看有哪些gpio,根据其地址判断引脚 (字幕为小写的L)
(目前没有AXI_GPIO)
也就是说,0xE0003000的MIO[0]为gpiochip480,一直到MIO[31]为gpiochip511。
bank地址
Bank | addr | gpiochip |
A | 0xE000_3000 | 480 - 511 |
B | 0xE000_3100 | 458 - 479 |
C | 0xE000_3200 | 426 - 457 |
D | 0xE000_3400 | 394 - 425 |
命令
添加设备接口命令 echo num > /sys/class/gpio/export
num为gpiochip数字
删除设备接口命令 echo num > /sys/class/gpio/unexport
编辑gpio的信息:
cd /sys/class/gpio/gpionum (num仍未gpiochip数字,如500)
ls -l
u-boot下操作
在启动linux时随便按键盘上的某个键,就会进入u-boot下:
uart
qspi flash
cat /proc/mtd 查看qspi flash分区
hexdump -C -n 64 /dev/某个分区 读该分区,长度为64个字节
echo "写入flash的字符串内容"
ZYNQ-Linux开发之(七)国产化复旦微电子FMQL平台uboot和kernel无法识别国产SPI Flash 芯片以及分区的问题_复旦微fmql 社区-CSDN博客
phy
配置
ip:
因为linux设置与主机共享ip,所以看主机piv4的地址即可。
命令
root下输入:
ifconfig -a 查看系统中所有的网络设备
ifconfig 查看系统当前已激活(打开)的网络设备
能ping通电脑: (每次重启开发板都要再来一次)(u-boot下设置就不用)
但是开发板和ubuntu不能互ping通:
还是不太行。
看这个:Linux开发板网络直连电脑的设置方法_哔哩哔哩_bilibili
因为电脑没有禁止wifi。
还有一个原因是ubuntu的网络设置:
这样就可以ping通ubuntu了。
u-boot
ipaddr是开发板的ip;serverip是ubuntu(电脑中的linux系统,而不是开发板的系统)的ip
SD卡
以下为zynq命令。
以上只是ubuntu下通过shell命令对外设进行操作。
接下来要学怎么写驱动程序了。