学习笔记一

发布于:2023-01-19 ⋅ 阅读:(399) ⋅ 点赞:(0)

7-25:编译android源码,安装编译公码的环境,然后source,lunch,make命令,进行编译。

问题1:下载repo/manifests中default.xml时无法执行命令,(在安装repo的时候,解压到了bin目录下,没有可执行权限)

解决:通过百度查询原因得知文档读写运行权限问题无法执行命令,没有可执行权限,经过chmod 777将权限改为所有用户组都为rwx,最终问题得到解决。

问题2:将python2.7.6设置为默认python时找不到python目录

解决:在用户目录下找python和根目录产生混淆,最后在根目录下找到

7-26号:装驱动,通过adb进入下载模式,然后将程序(系统)通过qfil下载到开发板里,这个过程的作用就是,若是将开发板的程序写乱了,还可以通过这个步骤重装一下系统,也就是刷机。

7-27号:讲解了安卓源码的作用,以及qfile进行单刷,单刷就是分扇区进行程序的烧写。

 驱动流程分为5个部分:1、分配  2、设置  3、注册file_operation  4、入口  5、出口

https://img-blog.csdn.net/20160309214742782?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

a -- 使用cdev结构体来描述字符设备;

b -- 通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性;

c -- 通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等;

1.什么是设备树

这里不会用太多专业名词来解释设备树是什么,如果需要从专业的角度去理解网上有很多相关的书籍和资源供大家参考。这里我用通俗的语言对设备树做一个解释。举个例子,你的设备驱动是一套炒菜的流程,但是具体用哪个锅,哪种火,是天然气还是电磁炉,你需要告诉他,这些东西也就是你机器的硬件信息。

2.为什么要用设备树

以往驱动的这些硬件信息都是存在一个单独的文件里的,但是你想想,这么多厨师,这么多种菜,显然每一个都准备一个文件来描述,这个会增加Linux内核的冗余度,对内核非常不友好。当一个公司在一个产品上,比如一台手机上,用到了几十个硬件,而且手机还要迭代做很多代,为了尽量避免因为硬件不同带来的软件增加,就选择了设备树,设备树风格很简单,花上几天的时间去看一下就能明白。

struct file_operations • 把系统调用和驱动程序关联起来的关键数据结构。每个成员对应一个系统调用。

流程:用户open--通过file_operations(内核与用户)(--系统调用--- --驱动的open函数。

为了保证Linux的开放性,设计者必须考虑如何使Linux除了支持Ext2文件系统外,还能支持其它各种不同的文件系统,例如日志文件系统、集群文件系统以及加密文件系统等。因此,就必须把各种不同文件系统的操作和管理纳入到一个统一的框架中,使得用户程序通过同一个文件系界面,即同一组系统调用,能对各种不同的文件系统和文件操作。用户程序不必关心各种不同文件系统的实现细节,而使用系统提供统一、抽象、虚拟的文件系统界面。这种统一的框架就是虚拟文件系统转换,一般简称虚拟文件系统(VFS)。

我们在学习裸机或者 STM32 的时候关于驱动的开发就是初始化相应的外设寄存器,在 Linux 驱动开发中肯定也是要初始化相应的外设寄存器。Linux 驱动开发中我们需要按照其规定的框架来编写驱动,所以说学 Linux 驱动开发重点是学习其驱动框架。

字符设备的加载{ “insmod”命令加载驱动模块,module_init(xxx_init)指定驱动的入口函数}; 驱动模块加载成功以后需要注册字符设备(static inline int register_chrdev,其中使用了fileoperation类型的数据),一般字符设备的注册在驱动模块的入口函数 xxx_init 中进行,字符设备的注销在驱动模块 的出口函数 xxx_exit中进行。

编译的步骤:遍历每个源码目录Makefile => 根据每个目录的Kconfig来配置Makefile,定制要编译的对象 => 回到顶层目录的Makefile执行编译。链接:Kconfig文件的用途及解析_Felix_8_的博客-CSDN博客_kconfig文件的作用

配置安卓(linux)驱动过程:

1 下载堡垒机上的winton/helloworld_config.zip 到本地
2 上传本地修改的 文件 到台式机
   scp helloworld_xxx.zip group@xx.xx.xx.xx:/home/group/work/kernel/msm-4.9/drivers/misc
3 连接到台式机,解压,改名后缀+自己的名字
4 配置misc文件夹上的 Kconfig
   最后一行 source“drivers/misc/helloworld_xxx/Kconfig”
5 配置misc上的 Makefile
   obj - $(CONFIG_HELLO_WORLD_XXX) += helloworld_xxx/helloworld.o  
6 更改 /home/group/work/kernel/msm-4.9/arch/arm64/config/sdm670_defconfig 文件
最后一行加入CONFIG_HELLO_WORLD_XXX = y
7 进入到work命令行
source buil/envsetup.sh
lunch 49
make bootimage -j8

编译成功后再out/target/product/sdm710/obj/KERNEL_OBJ/drivers/misc/helloworld_xxx下查看是否有helloworld_xxx.o 文件
有则成功。没有则查看Kconfig 或者Makefile 配置是否正确
成功就上传编译成功的out/target/product/sdm710/boot.img  文件到堡垒机,然后再下载到笔记本上

所遇到问题:所有的宏书写格式应该是大写,没验证完成就上传代码就git commit,没有生成built-in.o文件,是因为obj路径加上了/.o,(老师说helloworld.o是在子目录的makefile中配置的,这里不需要添加,只需要设置路径即可),(但这个模块怎样和上一级的Makefile Kconfig发生联系呢,那就要修改drivers目录下的MakefileKconfig

drivers/Makefile添加一行obj-y += helloworld/

Default y,编译进内核,m,编译成模块,n不编译。

7-28周五,分扇区把自己的程序烧录进去:cmd里adb reboot edl进入刷机模式,
先选端口,再tools-》倒数第二个partition manager-》出来的是分区,左键选中boot_a,

再右键第一个选项,进来选择load manage选boot.img,成功后,安装后 按phome_on按键重启,十秒,adb' shell 看看是不是重启了,

验证:进入/sys/devices/virtual/hel__/hel/hel…/自己的文件下,cat 输出。(在虚拟文件系统)
据说,cat对应的是show函数,而echo会调用store函数?它会进行进行储存,然后demsg会进行输出日志。再就是有个函数是专门配置程序的输入输出的。

虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象。

8-1

个人代码提交步骤:

1. 验证完全后,git status查看

2. git add **

3. 本地创建commitfile文件,将commit message添加修改后,使用git commit -f commitfile,git commit。

4. git push origin HEAD:refs/for/master

 
注意:
公共文件的提交,应该先pull下来,在拉取的基础上修改,然后再push上去,这样的话,后一个人才不会覆盖前一个人的;
代码中log信息,device等name都加上各自的名字做下区分;
提交时commit message内请把使用adb logcat -b all > ***.txt内对应的log添加上,带时间戳的log;
Makefile里面不能加中文注释;

同一台台式机账户下的可以先不急着提,等待前一个人merge之后在提交,否则的话,就会出现merge冲突,因为我git pull的是过去的版本;


 
客户项目要求规范:
代码文件中不要有多余的空格,也不要出现空行;
代码里的注释部分,最好使用英文注释;

宏定义呀,变量定义呀,注意一下大小写,例如hello_EURAKE,一个字符串加尾缀的时候和前面保持一致;

 

代码提交以及拉下来的命令:

 

pull会覆盖工作区和缓存区。 

显然,HAL层的根本设计目的是在于上层软件可以通过常规的通用接口访问MCU的某些资源,而不用去关心“是哪个MCU”在做的,模糊了最底层的函数实现。

提示找不到hidl-gen的,在源码根目录下执行:
m -j hidl-gen

执行这个编译命令的时候 要先搭源码编译环境,就是: source build/envsetup.sh lunch 49
 
使用qfil单刷vendor分区可能出问题,建议使用fastboot来刷分区,刷完后摁一下PHONE_ON按键启动板卡

一般发生错误之后,就先把缓存区reset,然后git pullremote的内容pullworkspace空间。

行开头不能用tab,得用空格。而且一定要注意代码规范,必要的空行还是要有的。

                                                 

 


网站公告

今日签到

点亮在社区的每一天
去签到