关于stm32mp157

目录

设备树:

内核移植:

编写一个驱动的过程:

编写i2c传感器驱动的过程:


从arm11后,命名改为cortex,

        1.cortex A:高端应用型领域

        2.cortex R:实时性要求

        3.cortex M:单片机领域 

stm32mp157(双核异构)有两个cortexA7(主频650MHZ,最高可达800HZ),有一个cortexM4(主频209MHZ),16位ADC

设备树:

Linux3.x出现的一种用来管理板级资源的机制,使用节点形式描述板子上的资源;Linux5.4.31->arch/arm/boot/dts中存放设备树文件     

内核移植:

Linux5.4.31内核版本(支持设备树):

       1.使用usb,通过STM32CubeProgermmer烧写uboot(拨码开关 000),为系统运行提供一个合适的环境,包括:

                (1.对硬件初始化(初始化cpu工作模式SVC,初始化内存,初始化时钟,关闭中断和看门狗,关闭 Dcache) 

                (2.对串口网口初始化

                (3.将内核映像从flash搬到内存

                (4.向内核传参(R0 = 0,R1 = Machine ID,R2 = 基地址) 

        2.编译内核Kernel(uImage;Image->zlmage->uImage(自解压的过程))以及设备树

                (1.因为st官方源码不支持YT8511,需要自己移植:

                               a.将motorcomm.c和motorcomm_phy.c分别拷贝到drivers/net/phy和/include/linux

                               b.修改drivers/net/phy/Makefile: 97行 -> obj -$(CONFIG_MOTORCOMM_PHY) += motorcomm.o

                                c.修改Kconfig:

                                d.修改 make menuconfig

                (2.执行build.sh脚本(./build.sh)生成uImage和dtb文件

                (3.通过tftp将ulmage和.dtb下载到板子里 -> 设置环境变量bootcmd tftp c2000000 uImage  tftp c4000000 .dtb

                (4.编译Kernel的一些过程

                        (a.对内核映像完成解压

                        (b.跳转到解压后的内核入口点

                        (c.执行start_kernel函数(C语言函数),完成内核大部分初始化工作 

                (5.mkimage -l uImage                    

        3.根文件系统:nfs挂载根文件系统

                (1.使用busybox制作根文件系统

        4.向根文件系统添加lib库

                (1. 向rootfs/lib添加.so动态库:

                        (a.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm none-linux-gnueabihf/libc/lib

                        (b.cp *so* /home/linux/nfs/rootfs/lib/ -d

                        (c. 在rootfs/lib中 rm ld-linux-armhf.so.3

                        (d.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm none-linux-gnueabihf/libc/lib

                        (e.cp ld-linux-armhf.so.3 /home/linux/nfs/rootfs/lib/

                (2. 向rootfs/lib添加静态库文件

                        (a.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm none-linux-gnueabihf/lib

                        (b.cp *so* *.a /home/linux/nfs/rootfs/lib/ -d

                (3.向 rootfs/usr/lib"添加库文件

                        (a.mkdir /home/linux/nfs/rootfs/usr/lib

                        (b.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib

                        (c.cp *so* *.a /home/linux/nfs/rootfs/usr/lib/ -d

        5.init进程:执行init进程,开启用户空间;在bootargs中,init = /linuxrc,是内核启动执行的第一个进程

编写一个驱动的过程:

        1.在stm32mp157-atk.dts设备文件中增加设备节点

        2.在顶层目录通过make dtbs命令编译设备树文件,生成dtb文件:stm32mp157-atk.dtb

        3.dtb和ulmage拷贝到tftb指定路径下(tftpboot),并使用编译好的dtb和ulmage启动内核

        4.使用of函数从节点将设备信息解析出来

        5.进行GPIO相关操作,初始化,映射等

        6.编译成.ko -> insmod.ko -> init ->

        7.运行应用层程序

编写i2c传感器驱动的过程:

        1.在dts设备文件中,在i2c控制器节点下添加新的传感器设备节点

        2.make dtbs

        3.将dtb文件拷贝到tftp指定目录(tftpboot)

        4.编写i2c设备树驱动程序(spi类似)

                (a.insmod后,首先执行init函数,i2c_add_driver();   -> 将驱动注册到总线中

                (b.static const struct of_device_id match[] = {

                                {.compatible = "atk,lm75"},

                        };   -> 匹配设备树节点

                (c.匹配成功后执行driver函数中的probe函数,完成字符型设备驱动的初始化(注册字符型设备,初始化以及添加cdev,自动生成设备节点等)

                (d.当rmmod时,执行exit函数,i2c_del_driver();  -> 将i2c从总线上注销

                (e.执行remove函数(因为i2c_del_driver();)

                (f.再这个过程中,执行file_opreation结构体驱动层操作函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值