选择stm32f429-discovery板来移植linux,主要是考虑到st的mcu在世界范围内实在是太火了,外设资源非常丰富,且429出来很多年,加上主线linux对stm32f4 f7的支持,可以很容易就在f4,f7系列上应用起丰富的linux各种软件资源,产品方案公司只用关心应用层的设计。
目前这个移植已完成的工作
1 u-boot+linux+initramfs可以从内部flash启动并运行。由于linux内核编译出来已超过3M字节,内部flash只有2M无法使用xip功能,因此采用zImage加载到sdram 0x90008000地址运行,整体效率相对xip会有一定折扣,比如3wire-spi模式,读取lcd的id时,会出现overrun。
2 spi+ili9341+tinydrm+fbdev可以工作,lcd上能看到启动日志
3 stmpe811,l3gd20传感器的驱动加入内核,驱动可识别外设。但未验证
下一步
1 将ili9341驱动移入panel下,可以和ltdc对接。提升屏幕刷新速率,支持osd
2 测试dcmi+ov5640,可使用v4l2将视频数据显示到ili9341(可能sdram和内部flash不够)
3 移植linux到stm32f469-discovery
玩linux最大的乐趣不在于将主线的代码做修改移植到自己的板子上,而是发现主线代码的bug并修改。
由于当时是在ubuntu环境下随笔记录,没有中文输入法,就用了英文, 见谅.
stm32f429-disco-linux-5.5.3.zip
(1.65 MB)
crosscompile toolchain
get compile tool from
https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2?revision=108bd959-44bd-4619-9c19-26187abf5225&la=en&hash=E788CE92E5DFD64B2A8C246BBA91A249CB8E2D2D
u-boot configure, compile
get u-boot code from https://gitlab.denx.de/u-boot/u-boot
change point:
1 Makefile
line 37 #undefine MK_ARCH
2 open CONFIG_ENV_IS_NOWHERE=y , to save 0x08040000 128k flash memory, we don't need runtime env save feature.
3 open FIT to support itb file load
CONFIG_FIT=y
CONFIG_FIT_EXTERNAL_OFFSET=0x0
CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
4 update cmdline
#define CONFIG_BOOTCOMMAND \
"run bootcmd_ramfs"
#define CONFIG_EXTRA_ENV_SETTINGS \
"bootargs_ramfs=console=ttySTM0,115200 root=/dev/ram rdinit=/linuxrc\0" \
"bootcmd_ramfs=setenv bootargs ${bootargs_ramfs};" \
"bootm 0x08040000\0"
configure step :
make O=../u-boot-build ARCH=arm CROSS_COMPILE=arm-none-eabi- stm32f429-discovery_defconfig
make O=../u-boot-build
sudo apt-get install openocd
openocd -f openocd.cfg -c flash_uboot
openocd configure file, openocd.cfg
source [find board/stm32f4discovery.cfg]
init
proc flash_uboot {} {
reset halt
flash write_image erase u-boot-build/u-boot-dtb.bin 0x08000000
reset init
shutdown
}
proc flash_full {} {
reset halt
flash write_image erase kernel.itb 0x08040000
reset init
shutdown
}
its configure file, kernel.its
/*
* Simple U-Boot uImage source file containing a single kernel and FDT blob
*/
/dts-v1/;
/ {
description = "Simple image with single Linux kernel and FDT blob";
#address-cells = <1>;
images {
kernel {
description = "Vanilla Linux kernel";
data = /incbin/("./kernel-build/arch/arm/boot/zImage");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x90008000>;
entry = <0x90008000>;
hash-1 {
algo = "crc32";
};
hash-2 {
algo = "sha1";
};
};
fdt-1 {
description = "Flattened Device Tree blob";
data = /incbin/("./kernel-build/arch/arm/boot/dts/stm32f429-disco.dtb");
type = "flat_dt";
arch = "arm";
compression = "none";
hash-1 {
algo = "crc32";
};
hash-2 {
algo = "sha1";
};
};
};
configurations {
default = "conf-1";
conf-1 {
description = "Boot Linux kernel with FDT blob";
kernel = "kernel";
fdt = "fdt-1";
};
};
};
linux configure, compile
get kernel code from https://www.kernel.org/
change point:
1 arch/arm/boot/dts/stm32f4-pinctrl.dtsi add i2c3 pin mux
i2c3_pins: i2c3@0 {
pins {
pinmux = <STM32_PINMUX('C', 9, AF4)>, /* I2C3_SDA */
<STM32_PINMUX('A', 8, AF4)>; /* I2C3_SCL */
bias-disable;
drive-open-drain;
slew-rate = <3>;
};
};
2 arch/arm/boot/dts/stm32f429-disco.dts add stmpe811 touchscreen dts support
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/gpio/gpio.h>
reg_3p3v: regulator-3p3v {
compatible = "regulator-fixed";
regulator-name = "3P3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
&i2c3 {
pinctrl-names = "default";
pinctrl-0 = <&i2c3_pins>;
status = "okay";
touch: stmpe811@41 {
compatible = "st,stmpe811";
reg = <0x41>;
interrupts = <15 IRQ_TYPE_EDGE_FALLING>;
interrupt-parent = <&gpioa>;
vio = <®_3p3v>;
vcc = <®_3p3v>;
stmpe_touchscreen {
compatible = "st,stmpe-ts";
st,sample-time = <4>;
st,mod-12b = <1>;
st,ref-sel = <0>;
st,adc-freq = <1>;
st,ave-ctrl = <1>;
st,touch-det-delay = <2>;
st,settling = <2>;
st,fraction-z = <7>;
st,i-drive = <1>;
};
};
};
3 arch/arm/boot/dts/stm32f429.dtsi add i2c3 reg , clk, interrupts
i2c3: i2c@40005c00 {
compatible = "st,stm32f4-i2c";
reg = <0x40005c00 0x400>;
interrupts = <72>,
<73>;
resets = <&rcc STM32F4_APB1_RESET(I2C3)>;
clocks = <&rcc 0 STM32F4_APB1_CLOCK(I2C3)>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
4 arch/arm/boot/dts/stm32f4-pinctrl.dtsi add ltdc, spi5 pin mux
ltdc_pins_disco: ltdc@1 {
pins {
pinmux =
<STM32_PINMUX('C', 6, AF14)>, /* LCD_HSYNC */
<STM32_PINMUX('A', 4, AF14)>, /* LCD_VSYNC */
<STM32_PINMUX('G', 7, AF14)>, /* LCD_CLK */
<STM32_PINMUX('C', 10, AF14)>, /* LCD_R2 */
<STM32_PINMUX('B', 0, AF9)>, /* LCD_R3 */
<STM32_PINMUX('A', 11, AF14)>, /* LCD_R4 */
<STM32_PINMUX('A', 12, AF14)>, /* LCD_R5 */
<STM32_PINMUX('B', 1, AF9)>, /* LCD_R6*/
<STM32_PINMUX('G', 6, AF14)>, /* LCD_R7 */
<STM32_PINMUX('A', 6, AF14)>, /* LCD_G2 */
<STM32_PINMUX('G', 10, AF9)>, /* LCD_G3 */
<STM32_PINMUX('B', 10, AF14)>, /* LCD_G4 */
<STM32_PINMUX('D', 6, AF14)>, /* LCD_B2 */
<STM32_PINMUX('G', 11, AF14)>, /* LCD_B3*/
<STM32_PINMUX('B', 11, AF14)>, /* LCD_G5 */
<STM32_PINMUX('C', 7, AF14)>, /* LCD_G6 */
<STM32_PINMUX('D', 3, AF14)>, /* LCD_G7 */
<STM32_PINMUX('G', 12, AF9)>, /* LCD_B4 */
<STM32_PINMUX('A', 3, AF14)>, /* LCD_B5 */
<STM32_PINMUX('B', 8, AF14)>, /* LCD_B6 */
<STM32_PINMUX('B', 9, AF14)>, /* LCD_B7 */
<STM32_PINMUX('F', 10, AF14)>; /* LCD_DE */
slew-rate = <2>;
};
};
spi5_pins: spi5@0 {
pins1 {
pinmux =
<STM32_PINMUX('F', 7, AF5)>, /* SPI5_CLK */
<STM32_PINMUX('F', 9, AF5)>; /* SPI5_MOSI */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
pins2 {
pinmux = <STM32_PINMUX('F', 8, AF5)>; /* SPI5_MISO */
bias-disable;
};
};
5 arch/arm/boot/dts/stm32f429-disco.dts add l3gd20, ili9341 dts
panel_backlight:backlight {
compatible = "gpio-backlight";
gpios = <&gpiog 2 1>;
default-on;
status = "okay";
};
/*bak: actually, ili9341 don't need gpio-bakclight dts node, just add here make tinydrm driver happy*/
&spi5 {
status = "okay";
pinctrl-0 = <&spi5_pins>;
pinctrl-names = "default";
#address-cells = <1>;
#size-cells = <0>;
cs-gpios = <&gpioc 1 GPIO_ACTIVE_LOW>,<&gpioc 2 GPIO_ACTIVE_LOW>;
dmas = <&dma2 3 2 0x400 0x0>,
<&dma2 4 2 0x400 0x0>;
dma-names = "rx", "tx";
l3gd20: l3gd20@0 {
compatible = "st,l3gd20-gyro";
spi-max-frequency = <10000000>;
st,drdy-int-pin = <2>;
interrupt-parent = <&gpioa>;
interrupts = <1 IRQ_TYPE_EDGE_RISING>,
<2 IRQ_TYPE_EDGE_RISING>;
reg = <0>;
vddio = <®_3p3v>;
vdd = <®_3p3v>;
};
display: display@1{
compatible = "adafruit,yx240qv29", "ilitek,ili9341";
reg = <1>;
spi-3wire;
spi-max-frequency = <10000000>;
dc = <&gpiod 13 1>;
rotation = <90>;
backlight = <&panel_backlight>;
};
};
6 drivers/spi/spi-stm32.c
7 kernel config change
stm32-kernel.zip
(16.89 KB)
make O=../kernel-build stm32_defconfig
make O=../kernel-build LOADADDR=0x90008000 zImage dtbs
stm32 2m flash layout
0x08000000 - 0x0803fffff u-boot-dtb.bin
0x08040000 - 0x08200000 kernel.itb
initramfs filesystem
get filesystem from https://elinux.org/File:Stm32_mini_rootfs.cpio.bz2
1 bzip2 -d Stm32_mini_rootfs.cpio.bz2
2 mkdir rootfs
3 cd rootfs/
4 sudo cpio -idmv < ../Stm32_mini_rootfs.cpio
5 paste below strings to init
#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init $
use mkimage to create kernel.itb, include zImage with initramfs,dtb
./u-boot-build/tools/mkimage -f kernel.its kernel.itb
use stlink-utils to flash kernel.itb to 0x08040000
TODO: as memory limition, there is no more rom to add user app to verify touch-screen, geting l3gd20 gyro data, drm-utils,will do it after get large memory board. currently just verify the driver register to system.
Log:
U-Boot 2020.04-rc2-gdc67a56-dirty (Feb 26 2020 - 17:13:10 +0800)
DRAM: 8 MiB
Flash: 2 MiB
In: serial@40011000
Out: serial@40011000
Err: serial@40011000
Hit any key to stop autoboot: 0
## Loading kernel from FIT Image at 08040000 ...
Using 'conf-1' configuration
Trying 'kernel' kernel subimage
Description: Vanilla Linux kernel
Type: Kernel Image
Compression: uncompressed
Data Start: 0x080400e8
Data Size: 1762256 Bytes = 1.7 MiB
Architecture: ARM
OS: Linux
Load Address: 0x90008000
Entry Point: 0x90008000
Hash algo: crc32
Hash value: 59603570
Hash algo: sha1
Hash value: 84ebfe63331e4d53b0d1e9c9bd308b5082711ca9
Verifying Hash Integrity ... crc32+ sha1+ OK
## Loading fdt from FIT Image at 08040000 ...
Using 'conf-1' configuration
Trying 'fdt-1' fdt subimage
Description: Flattened Device Tree blob
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x081ee5e0
Data Size: 19800 Bytes = 19.3 KiB
Architecture: ARM
Hash algo: crc32
Hash value: 87ea4d4c
Hash algo: sha1
Hash value: 820dc759459a2c7f7dfe641093f9e7c19dacbcea
Verifying Hash Integrity ... crc32+ sha1+ OK
Booting using the fdt blob at 0x81ee5e0
Loading Kernel Image
Loading Device Tree to 905b4000, end 905bbd57 ... OK
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.5.3-gfa93efe-dirty (th@th-Latitude-XT3) (gcc version 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] (GNU Tools for Arm Embedded Processors 9-2019-q4-major)) #3 PREEMPT Wed Feb 26 16:50:54 CST 2020
[ 0.000000] CPU: ARMv7-M [410fc241] revision 1 (ARMv7M), cr=00000000
[ 0.000000] CPU: unknown data cache, unknown instruction cache
[ 0.000000] OF: fdt: Machine model: STMicroelectronics STM32F429i-DISCO board
[ 0.000000] On node 0 totalpages: 2048
[ 0.000000] Normal zone: 16 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 2048 pages, LIFO batch:0
[ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[ 0.000000] pcpu-alloc: [0] 0
[ 0.000000] Built 1 zonelists, mobility grouping off. Total pages: 2032
[ 0.000000] Kernel command line: console=ttySTM0,115200 root=/dev/ram rdinit=/linuxrc loglevel=8 console=/dev/fb0 fbcon=map:0
[ 0.000000] Dentry cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 5072K/8192K available (1671K kernel code, 146K rwdata, 680K rodata, 216K init, 107K bss, 3120K reserved, 0K cma-reserved)
[ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] rcu: Preemptible hierarchical RCU implementation.
[ 0.000000] Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[ 0.000000] /soc/interrupt-controller@40013c00: bank0
[ 0.000000] random: get_random_bytes called from start_kernel+0x1b3/0x320 with crng_init=0
[ 0.000000] clocksource: arm_system_timer: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 331816030 ns
[ 0.000000] ARM System timer initialized as clocksource
[ 0.000237] sched_clock: 32 bits at 90MHz, resolution 11ns, wraps every 23860929530ns
[ 0.000498] timer@40000c00: STM32 sched_clock registered
[ 0.000955] Switching to timer-based delay loop, resolution 11ns
[ 0.001211] timer@40000c00: STM32 delay timer registered
[ 0.001733] clocksource: timer@40000c00: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 21236227187 ns
[ 0.002316] /soc/timer@40000c00: STM32 clockevent driver initialized (32 bits)
[ 0.008419] Calibrating delay loop (skipped), value calculated using timer frequency.. 180.00 BogoMIPS (lpj=900000)
[ 0.008890] pid_max: default: 4096 minimum: 301
[ 0.012786] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.013309] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.040257] rcu: Hierarchical SRCU implementation.
[ 0.045459] devtmpfs: initialized
[ 0.263198] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.263593] pinctrl core: initialized pinctrl subsystem
[ 0.454026] stm32f429-pinctrl soc:pin-controller: No package detected, use default one
[ 0.468984] stm32f429-pinctrl soc:pin-controller: GPIOA bank added
[ 0.475184] stm32f429-pinctrl soc:pin-controller: GPIOB bank added
[ 0.481153] stm32f429-pinctrl soc:pin-controller: GPIOC bank added
[ 0.487272] stm32f429-pinctrl soc:pin-controller: GPIOD bank added
[ 0.493313] stm32f429-pinctrl soc:pin-controller: GPIOE bank added
[ 0.499418] stm32f429-pinctrl soc:pin-controller: GPIOF bank added
[ 0.505540] stm32f429-pinctrl soc:pin-controller: GPIOG bank added
[ 0.511497] stm32f429-pinctrl soc:pin-controller: GPIOH bank added
[ 0.517922] stm32f429-pinctrl soc:pin-controller: GPIOI bank added
[ 0.523809] stm32f429-pinctrl soc:pin-controller: GPIOJ bank added
[ 0.529952] stm32f429-pinctrl soc:pin-controller: GPIOK bank added
[ 0.530599] stm32f429-pinctrl soc:pin-controller: Pinctrl STM32 initialized
[ 0.718086] stm32-dma 40026000.dma-controller: STM32 DMA driver registered
[ 0.747631] stm32-dma 40026400.dma-controller: STM32 DMA driver registered
[ 0.785824] clocksource: Switched to clocksource timer@40000c00
[ 1.385760] workingset: timestamp_bits=30 max_order=11 bucket_order=0
[ 1.572198] io scheduler mq-deadline registered
[ 1.572446] io scheduler kyber registered
[ 1.595395] STM32 USART driver initialized
[ 1.601590] 40011000.serial: ttySTM0 at MMIO 0x40011000 (irq = 34, base_baud = 5625000) is a stm32-usart
[ 2.015282] printk: console [ttySTM0] enabled
[ 2.085487] [drm] Initialized ili9341 1.0.0 20180514 for spi0.1 on minor 0
[ 2.117646] ili9341 spi0.1: fb0: ili9341drmfb frame buffer device
[ 2.126249] spi_stm32 40015000.spi: driver initialized
[ 2.152951] stm32_rtc 40002800.rtc: registered as rtc0
[ 2.160552] stm32_rtc 40002800.rtc: Date/Time must be initialized
[ 2.170391] i2c /dev entries driver
[ 2.195837] stmpe-i2c 0-0041: stmpe811 detected, chip id: 0x811
[ 2.236797] random: fast init done
[ 2.251960] stmpe-ts stmpe-ts: DMA mask not set
[ 2.281125] input: stmpe-ts as /devices/platform/soc/40005c00.i2c/i2c-0/0-0041/stmpe-ts/input/input0
[ 2.293532] stm32f4-i2c 40005c00.i2c: STM32F4 I2C driver registered
[ 2.339105] st-gyro-spi spi0.0: spi0.0 supply vdd not found, using dummy regulator
[ 2.347726] st-gyro-spi spi0.0: spi0.0 supply vddio not found, using dummy regulator
[ 2.371508] iio iio:device0: interrupts on the rising edge
[ 2.395188] iio iio:device0: registered gyroscope l3gd20
[ 2.423991] input: gpio_keys as /devices/platform/gpio_keys/input/input1
[ 2.434153] stm32_rtc 40002800.rtc: setting system clock to 2000-01-01T00:55:40 UTC (946688140)
[ 2.480310] Freeing unused kernel memory: 216K
[ 2.484813] This architecture does not have kernel memory protection.
[ 2.491595] Run /linuxrc as init process
/ # free
total used free shared buffers cached
Mem: 5288 3644 1644 0 0 648
-/+ buffers/cache: 2996 2292
/ # [ 278.407733] random: crng init done
/ # ls /sys/class
backlight drm input mmc_host tty
bdi graphics leds regulator wakeup
block i2c-adapter mem rtc watchdog
dma i2c-dev misc spi_master
/ # ls /sys/class/drm
card0 card0-SPI-1 version
/ # ls -l /sys/class/drm
lrwxrwxrwx 1 0 0 0 Jan 1 01:23 card0 -> ../../devices/platform/soc/40015000.spi/spi_master/spi0/spi0.1/drm/card0
lrwxrwxrwx 1 0 0 0 Jan 1 01:23 card0-SPI-1 -> ../../devices/platform/soc/40015000.spi/spi_master/spi0/spi0.1/drm/card0/card0-SPI-1
-r--r--r-- 1 0 0 4096 Jan 1 01:23 version
/ # ls -l /sys/class/graphics
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 fb0 -> ../../devices/platform/soc/40015000.spi/spi_master/spi0/spi0.1/graphics/fb0
/ # ls -l /sys/class/input
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 input0 -> ../../devices/platform/soc/40005c00.i2c/i2c-0/0-0041/stmpe-ts/input/input0
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 input1 -> ../../devices/platform/gpio_keys/input/input1
/ # ls -l /sys/class/spi_master
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 spi0 -> ../../devices/platform/soc/40015000.spi/spi_master/spi0
/ # ls -l /sys/class/spi_master/spi0
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 /sys/class/spi_master/spi0 -> ../../devices/platform/soc/40015000.spi/spi_master/spi0
/ # ls -l /sys/class/spi_master/spi0/
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 device -> ../../../40015000.spi
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 of_node -> ../../../../../../firmware/devicetree/base/soc/spi@40015000
drwxr-xr-x 2 0 0 0 Jan 1 01:24 power
drwxr-xr-x 6 0 0 0 Jan 1 01:24 spi0.0
drwxr-xr-x 6 0 0 0 Jan 1 01:24 spi0.1
drwxr-xr-x 2 0 0 0 Jan 1 01:24 statistics
lrwxrwxrwx 1 0 0 0 Jan 1 01:24 subsystem -> ../../../../../../class/spi_master
-rw-r--r-- 1 0 0 4096 Jan 1 01:24 uevent
/ # ls -l /sys/class/spi_master/spi0/spi0.0
lrwxrwxrwx 1 0 0 0 Jan 1 01:25 driver -> ../../../../../../../bus/spi/drivers/st-gyro-spi
-rw-r--r-- 1 0 0 4096 Jan 1 01:25 driver_override
drwxr-xr-x 6 0 0 0 Jan 1 01:25 iio:device0
-r--r--r-- 1 0 0 4096 Jan 1 01:25 modalias
lrwxrwxrwx 1 0 0 0 Jan 1 01:25 of_node -> ../../../../../../../firmware/devicetree/base/soc/spi@40015000/l3gd20@0
drwxr-xr-x 2 0 0 0 Jan 1 01:25 power
drwxr-xr-x 2 0 0 0 Jan 1 01:25 statistics
lrwxrwxrwx 1 0 0 0 Jan 1 01:25 subsystem -> ../../../../../../../bus/spi
drwxr-xr-x 3 0 0 0 Jan 1 01:25 trigger0
-rw-r--r-- 1 0 0 4096 Jan 1 01:25 uevent
/ # ls -l /sys/class/spi_master/spi0/spi0.1
lrwxrwxrwx 1 0 0 0 Jan 1 01:25 driver -> ../../../../../../../bus/spi/drivers/ili9341
-rw-r--r-- 1 0 0 4096 Jan 1 01:25 driver_override
drwxr-xr-x 3 0 0 0 Jan 1 01:25 drm
drwxr-xr-x 3 0 0 0 Jan 1 01:25 graphics
-r--r--r-- 1 0 0 4096 Jan 1 01:25 modalias
lrwxrwxrwx 1 0 0 0 Jan 1 01:25 of_node -> ../../../../../../../firmware/devicetree/base/soc/spi@40015000/display@1
drwxr-xr-x 2 0 0 0 Jan 1 01:25 power
drwxr-xr-x 2 0 0 0 Jan 1 01:25 statistics
lrwxrwxrwx 1 0 0 0 Jan 1 01:25 subsystem -> ../../../../../../../bus/spi
-rw-r--r-- 1 0 0 4096 Jan 1 01:25 uevent
/ # free
total used free shared buffers cached
Mem: 5288 3680 1608 0 0 648
-/+ buffers/cache: 3032 2256
/ #
|
共1人点赞
|