Uboot和系统跑起来了,接下来就是进行驱动开发了;

Heartbeat(心跳灯)

修改设备树:

在设备树文件arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts中;

在 / { } 所包裹的根节点目录下添加:

leds {
    compatible = "gpio-leds";
    user_led {
    label = "led:usr";
        gpios = ; /* PE12 */
    };
};

其中

gpios = ; /* PE12 */

代表引脚 4 * 32 + 12也就是PE12( A~G: 0~6) 其名字为:led:usr

系统启动后与LED控制有关的文件;

系统启动后,将看到这样的文件:

$: ls /sys/class/leds/
led:usr

这里三个文件夹分别对应设备树中定义的三个LED;

编译设备树:

可以只编译设备树,不编译其他文件;

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j12

控制LED灯亮灭:

点亮LED:

$: echo 1 > /sys/class/leds/led\:usr/brightness

熄灭LED:

$: echo 0 > /sys/class/leds/led\:usr/brightness

控制LED闪烁:

$: ls /sys/class/leds/led\:usr/
brightness      invert          power           trigger
device          max_brightness  subsystem       uevent
$: cat /sys/class/leds/led\:usr/trigger
none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc0 [heartbeat] default-on
#这里可以看到当前的值为none,表示没有trigger,将其值改成heartbeat就可以看到闪烁了
$: echo heartbeat > /sys/class/leds/led\:usr/trigger

开机自动打开心跳灯:

作为系统服务自动启动,在这个目录添加脚本文件 /etc/init.d/; 作为登录用户的自动启动程序,在 /etc/profile.d/ 添加脚本文件;

新建脚本文件heartbeat_led.sh

echo heartbeat >/sys/class/leds/led\:usr/trigger

将该脚本放置于 /etc/profile.d/中即可开机自动调用该脚本:

$: ls /etc/profile.d/
heartbeat_led.sh  umask.sh

F1C100S GPIO操作:

#使用sysfs操作GPIO的例子:
echo 192 > /sys/class/gpio/export  #导出 PG0, GREEN
ls /sys/class/gpio/
export     gpio192    gpiochip0  unexport
ls /sys/class/gpio/gpio192/
active_low direction subsystem/ value device/ power/ uevent
echo "out" > /s
ys/class/gpio/gpio192/direction #设置为输出
echo 0 > /sys/class/gpio/gpio192/value     #亮灯
echo 1 > /sys/class/gpio/gpio192/value #灭灯
echo "in" > /sys/class/gpio/gpio192/direction #设置为输入
cat /sys/class/gpio/gpio192/value #读取电平
0

引脚计算规则:

在Linux中,GPIO 使用0~MAX_INT之间的整数标识; 对于32位CPU,每组GPIO 32个,引脚号就是按顺序排列; 从PA0开始gpio是0,那么PE3对应是32*4+3=131,经试验已验证;

这个板子是PE12引脚为LED引脚,故:

PIN_{num}=32\times4+12=140

故点灯的脚本如下:

echo "out" > /sys/class/gpio/gpio140/direction #设置为输出
#死循环
while true
do
    echo 0 > /sys/class/gpio/gpio140/value
    echo "点亮"
    sleep 0.1
    echo 1 > /sys/class/gpio/gpio140/value
    sleep 0.1
    echo "熄灭"
done

文件系统打包和解压缩(rootfs.tar):

压缩:

sudo tar -cvf rootfs.tar ./

解压:

sudo tar -xf ./rootfs.tar -C /mnt/

解压到SD卡中:

#如果分区已挂载到别的地方先进行卸载
sudo umount /dev/sdb2
#将分区挂载到 /mnt
sudo mount /dev/sdb2 /mnt
#解压并拷贝rootfs
cd ~/f1c100s-sdk/buildroot-2022.02/
sudo tar -xf output/images/rootfs.tar -C /mnt/
#保存退出
sync
sudo umount /dev/sdb2

复制.so文件到系统中:

From:

#虚拟机
/usr/arm-linux-gnueabi/lib

To:

#嵌入式Linux系统
/usr/lib

有名称相同的文件,跳过即可,不能覆盖;

关机操作:

需要注意的是,在开发板运行过程中,如果想要重启,请先执行:

poweroff

命令正常关闭系统后,在按重启按钮,否则有很大概率回造成文件系统损坏;