自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 Linux usb主机控制器HC阅读

一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver,它的内核软件模块代码是uhci-hcd.cuhci_hcd_init初始化开始:usb_disable函数:在启动参数cmdline,加入nousb参数可以禁止usb模块。

2024-09-24 19:56:37 1006

原创 Linux usb mass-storage 阅读

usb core:实现核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所有设备都会需要的公共的函数,初始化整个usb系统,初始化root_hubusb host 控制器:控制所有的usb设备的通信,CPU不是直接和usb设备通信,而是和控制器通信,CPU要对设备做什么动作,它会告诉控制器,HC再去负责处理。

2024-09-24 19:50:44 1141

原创 Linux usb hub阅读

可以阅读usb-skeleton.c文件,简单的一个usb设备驱动程序的框架。

2024-09-24 19:47:52 1001

原创 Linux usb core阅读

OHCI和UHCI支持的是usb1.1的控制器,支持的硬件范围不一样;EHCI支持的是usb2.0控制器的高速模式,它本身并不支持全速或者低速模式,硬件上通过TT电路来兼容CPU不会直接和usb设备通信,而是通过主机控制器HC去控制所有usb设备的通信usb总线是一种轮询方式的总线,所有的数据传输都必须由主机发起,HC初始化所有的数据传输,各种设备围绕再主机周围usb通信是通过endpoint,主机和endpoint之间数据传输是通过pipe;usb主机到设备是OUT端点,设备到主机是IN端点;

2024-09-24 19:44:06 924

转载 usb hub events

这个函数主要分成二部分,第一部分是向usb device侧获取设备的配置,接口,端口信息,这部分由第1-79行完成,首先,它为这些信息申请存放空间,然后像之前获取设备描述符一样,先发送一个9 个字节的请求,用来获取配置,接口,端口等描述符的总长度,最后根据得到的总长度去得到完成 的设备配置,接口,端口信息;如果不能在inums里找到与当前接口与相同项,表示这是一个新的接口,如果接口数n没有超过最大接口数32,则将当前接口号保存到inums数组里,并设置对应的接口设置数为1;

2024-07-23 14:20:31 70

转载 BIOS、UEFI、MBR、GPT、GRUB

在学习 Linux 系统启动原理之前,我们先了解下与操作系统启动相关的几个概念。BIOS+MBR这是最传统的,系统都会支持;唯一的缺点就是不支持容量大于2T的硬盘。BIOS+GPTBIOS是可以使用GPT分区表的硬盘来作为数据盘的,但不能引导系统;若电脑同时带有容量小于2T的硬盘和容量大于2T的硬盘,小于2T的可以用MBR分区表安装系统,而大于2T的可以使用GPT分区表来存放资料。但系统须使用64位系统。UEFI+MBR可以把UEFI设置成Legacy模式(传统模式)让其支持传统MBR启动,效果同。

2024-07-23 10:30:47 51

转载 内核学习——6、ftrace

可以看此文章:ftrace

2024-06-24 15:55:37 42

原创 充电相关名词

PD快充协议,是type-C口的快充协议,必须是俩头都是type-C口的线才行。QC是非常简单的一些快充协议,电源通过USB口的数据线就是D+/D-俩个pin,传递数据,信号就是移动设备给俩个PIN上面给多大电压,然后持续多久后拉低,电源就相应的给到多少电压和电流,总之这个非常的简单,我会在后面的文章里面做详细的介绍。2.VDD的D是Device的意思,指设备上的电压,我理解的就是设备运行的电压值,比如说STM32芯片的电压值一般为3.3V,说的应该就是VDD,VDD一般也指单极器件的正极。

2024-06-21 17:10:34 982

原创 内核学习——0、内核各类机制

定义interrupt-controller节点一般是bsp dts写好的要用哪个IO作为 irq,在自己设备节点中使用 interrupt-parent = <&外设>引用即可,然后interrupt = <信号脚 RISING/BOTH>,声明这个外设的具体哪个信号线和是什么电平触发。

2024-06-19 17:21:41 815

原创 内核学习——6、timer的学习和使用

/定时的时间点,当前时间的20ms之后。因为内核定时器是一个单次的定时器,所以如果想要多次重复定时时需要在定时器绑定的函数结尾重新装载时间,并启动定时。//绑定定时时间到后的执行函数。//添加并启动定时器。参数是timer中的变量data。

2024-06-19 17:07:30 406

原创 内核学习——5、中断

处理方式:硬中断是由CPU直接中断正在运行的程序,去处理中断源的请求;软中断需要将CPU的控制权转移到中断处理程序或其他特定的指令,待其处理完毕之后,再继续被打断的程序。软中断不会直接中断CPU,只有当前运行的进程才会产生软中断,软中断是一种需要内核为正在运行的进程去做一些事情(通常为IO)的请求。处理中断的驱动需要运行在CPU上的,中断产生时,CPU停止当前程序去处理中断请求,一个IRQ中断一个CPU。硬中断的中断号是由中断控制器提供,软中断的中断号是由指令直接指出,无需中断控制器。

2024-06-19 17:04:16 365

原创 内核学习——4、并发、竞争、同步与互斥

S加1,相加之后大于0,进程继续执行,若相加之后小于等于0,从信号等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。信号允许多个线程同时使用共享资源,和操作系统中PV操作相同,它有同时访问共享资源线程的最大数目,可以使等待资源进程进入休眠状态。S减1,若减1之后仍大于等于0,则进程继续执行,若减1之后小于0,该进程被阻塞到信号对应的队列中,然后转入进程调度。保护共享资源,实现线程同步。只有拥有互斥对象(即互斥量)的线程才具有访问共享资源的权限,互斥量只有一个,所以不能被多个线程同时访问。

2024-06-19 16:22:17 312

原创 内核学习——3、自旋锁的作用及其实现

作用:保护一段临界区的操作时独占的,不能由其他cpu或者线程同时访问破坏数据结构多核系统SMP:主要考虑一个cpu进入临界区之后,其他CPU不能再去进入这个临界代码区单核系统:不能被其他进程抢占单核系统自旋锁实现:两种情况打断:抢占、中断preempt_disable():关闭抢占preempt_enable():打开抢占普通自旋锁接口:spin_lock、spin_unlock:主要就是关闭和打开抢占风险是关闭抢占只是组织了其他进程对CPU的抢占,但不能阻止中断程序对CPU的抢占

2024-06-19 16:10:05 215

原创 内核学习——2、linux页高速缓存中脏页的概念

当进程修改了告诉缓存中的数据时,该页就被内核标记为脏页,内核将会在合适时间将脏页数据写到磁盘中,以保持高速缓存 中的数据和磁盘中的数据是一致的。硬盘的读写速度远不如内存速度,系统把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存。llinux是以页为高速缓存的单位。脏页是linux内核中的概念。

2024-06-19 15:20:13 124

原创 内核学习——1、list_head

通过结构体成员地址来求得结构体地址:ptr是所求结构体中的list_head成员指针,type是所求结构体类型,member是结构体list_head成员名。此时,list_head就作为它父结构体中的一个成员了,我们知道list_head的地址(指针)时,就可以通过list_entry来获得它的父结构的地址。结构体中没有数据域,所以一般把list_head嵌入到其他结构中使用。LIST_HEAD():生成双向链表头节点。list_for_each:遍历双向链表。双向循环链表:list_head。

2024-06-19 15:18:52 435

原创 USB学习——12、usb初始化和插拔驱动软件流程大致框架描述

1、xhci-plat.c主机控制器驱动那里,__usb_creat_hcd创建usb主机数据结构,main_hcd(primary_hcd)和shared_hcd,前者usb2.0,后者usb3.0,然后通过usb_add_hcd添加一个新的主机设备。4、之后hub_probe开始,hub_event 和 hub_configure ,hub的端口上有事件时去处理事件读取配置usb设备接口的描述符等配置,hub控制传输,hub状态变化,hub中断,hub port状态变化,

2024-06-19 15:14:06 558

原创 Linux的dev/ 和 sys/ 和 proc/ 目录

dev 目录存放的是应用与内核交互的设备文件,而/sys/dev目录存放的是系统的所有设备,这些设备由文件系统管理应用层操控底层两种方式:1、/dev 目录下的设备文件(设备节点) :复杂点的设备, LCD,摄像头等2、/sys 目录下设备的属性文件 :简单点的设备, led、gpio等。

2024-06-19 14:32:36 1051

原创 充电学习— 9、Typec Pd

GND:线缆接地TX RX:数据流data传输,支持2.0 3.0 speed兼容VBUS:线缆cable电源,bus powerCC:电缆cable的连接、方向、角色检测和当前模式的配置通道;有emark时, 一个成为VCONN,为电缆或者适配器供电,D+,D-:dp dm,可以短接, usb2.0上做设备连接type检测,根据bc1.2,识别sdp,cdp,dcpSBU:耳机、视屏,debug接口,dp(display port),

2024-06-19 11:44:42 1709

原创 充电学习—8、Type-C TCPC TCPCI

TCPC是usb Type-C port controller;通用串行总线C型端口控制器TCPCI是tcpc控制器接口规范;TCPC是个功能块,其中含有VBUS和VCONN的电源控制功能,CC信号的处理 逻辑,PD应用中的BMC物理层和协议层(PD信息的编码发送接收处理过程都在里面);信息的生成不包含其中USB-IF制定了一个接口标准,通过i2c接口将TCPM(Type-C port manager)和TCPC连接起来,所有的TCPC产品都以此标准来进行设计;

2024-06-19 10:28:33 728

原创 充电学习—7、BC1.2 PD协议

PD(portable device,便携式设备)中有个检测VBUS是否有效的电路,电路有个参考值,高于这个值认为VBUS有效,参考值不固定,一般在0.8V~4V之间。首先将PD+即设备的DP拉高至0.6V,然后检测PD-即设备DM的电压,如果小于规定的参考电压,则端口是数据口SDP;首先将PD-拉高至0.6V,然后检测PD+的电压,如果小于参考电压,则端口是CDP;PD快充充电时,DCP协议识别过程,首次检测和二次检测符合BC1.2规定,初始VBUS是5V,识别出DCP之后将VBUS提高至9V。

2024-06-18 22:15:51 1504

原创 充电学习—6、电量计FuelGauge

2、库伦计量法(电流积分法):通过充放电路劲上连接的一个电阻分压检测,ADC测量电阻上的电压,转换为电流值,实时计数器RTC把这个电流值对时间积分,从而得知流过多少库伦。启用了shipping mode相当于断开了后极回路的静态电流,只关注充电芯片的静态电流,减少产品的耗电,增加存储时间。进入shipping mode之后,充电芯片会关闭BATFET驱动,还可能关闭其他功能,让充电芯片的静态功耗更低。1、开路电压法(查表法):通过开路电压对应荷电状态查表而得;计算电池的剩余容量、充满时容量、电量百分比。

2024-06-18 21:57:28 887

原创 充电学习—5、healthed 电池服务

main函数中,首先根据传入的参数不同区分:开机充电、recovery、关机充电。这三种情况,然后指定不同的healthd_mode_ops回调函数。healthd_mode_ops是一个关于充电状态的结构体变量,main里面做healthed初始化,并做一个主循环持续。//当底层有信息时,会调用update更新BatteryService中相关值。电池电量、充电状态、低温关机、低电关机、电池状态、适配器插拔等。//将电池监听注册到底层。//发送电池状态变换广播。

2024-06-17 18:00:40 737

原创 充电学习—4、一次完整的调试

RK3399充电管理_cw2015RK3399-bq25700

2024-06-17 17:41:19 298

原创 充电学习—3、Uevent机制和其在android层的实现

uevent是内核发送消息到用户空间的一种途径,通过netlink实现, 内核中通过kobject_uevent、kobject_uevent_env发送uevent消息用户空间使用标准的socket接口来监听接收uevent消息,;或者通过uevent-helper调用用户空间进程mdev来进行热插拔动作,处理方式遵循mdev.conf规则而 uevent 把事件上报给用户空间有两种途径:通过 kmod 模块,直接调用用户空间的可执行程序或脚本;

2024-06-17 17:37:25 1053

原创 充电学习—2、开关电源基本原理

此种方式的相同之处:均采用时间比率控制(TRC)的稳压原理负载由轻变重,或者输出电压由高变低,分别通过,增加脉宽和升高脉频的方法使得输出电压保持稳定。

2024-06-17 15:12:15 446

原创 充电学习—1、psy框架梳理

此三部分是作为独立的设备驱动,都注册都power_supply下,每一个设备都是单独的psy设备,psy设备之间通过属性相互访问,2、struct power_supply_desc:该描述符定义了psy的属性,包括它的type,psy包含的属性列表和属性个数,等。5、power_supply_put:释放获取到的psy指针,和power_supply_get_by_name成对使用。4、power_supply_get_by_name:通过名字去获取一个psy指针。电池容量管理(容量自学习功能)

2024-06-17 15:10:10 814

原创 充电学习——0、电源管理

设备驱动作为系统一部分,会跟随系统进入低功耗状态,suspend (suspend-to-ram)一些驱动程序可以管理硬件的唤醒事件, 这一特性通过/sys/device/…/power/wakeup文件来开启和关闭在linxu中,通过 cat /sys/power/state可以看到当前设备支持的节能模式,一般有:standby:cpu处于浅睡模式,主要针对于cpu功耗mem:suspend to ram (STR): deep sleep睡眠 ,数据存ram,恢复快。

2024-06-17 15:00:23 493

原创 充电学习——总纲

2024-06-14 10:49:58 140

原创 usb协作驱动

如果dr_mode为host,需要初始化xHCI驱动。在dwc3_host_init函数的最后调用platform_device_add(xhci)添加platform device(xhci-hcd),用于匹配xHCI driver(xHCI driver为platform driver),1)在xhci_plat_init中调用platform_driver_register(&usb_xhci_driver)注册platform driver(“xhci-hcd”)

2024-06-13 17:32:41 1037

原创 mtk充电器插拔检测

这个函数会在do_charger_detection_work和chrdet_int_handler都去调用,主要是做psy设备状态改变之后的通知动作。

2024-06-13 17:08:53 418

原创 power_supply总框架

power supply framework给power supply(供电设备psy)提供统一框架,来管理battery,psy设备目的就是给系统充电,将一些必要信息给到上层用户,如充电源、电量变化、充放电状态、电池信息等可以分为两部分:1、电池监控(fuelgauge)fg2、充放电管理(charger)fuelgauge驱动:负责向上层android提供当前电池的容量和健康状态等电池信息,也给charger驱动提供电池的信息charger驱动:负责usb插拔检测、类型识别,充放电管理等。

2024-06-13 16:49:29 1146

原创 mtk低压充电&&关机充电&&关机动画显示

电池电压高于3.45v,boot_mode select中判断是否是关机充电:kernel_power_off_charging_detection,确定是KERNEL_POWER_OFF_CHARGING_BOOT之后会进入关机充电模式。低电量充电显示的动画是由[fhd_bat_10_01.bmp~ fhd_bat_10_01.bmp]这10张静态图片组成,针对verion 1.数字图片[fhd_num_0.bmp~ fhd_num_9.bmp]共10张,,针对verion 1.

2024-06-13 16:01:51 1261 2

原创 mtk镜像签名

执行完img_key_deploy.py之后,检查env.cfg下的配置是否更新。有了cert1和cert2 key后,就可以执行签名脚本。Step4: 下如下command 进行完成签名操作。env.cfg可以配置路径。

2024-06-13 15:33:10 899

原创 uboot启动内核总结

2024-06-13 15:25:43 75

原创 uid/chipid/socid

ChipID ChipID 一般存在于 AON_APB 寄存器上,用来标记芯片型号,更广义理解的话、 ChipID 还包括 VERSION ID AA/AB/AC )、 MFT_ID (标记晶圆厂及制程。UID UID 本质上是芯片在出厂 前 在 efuse 中专门的 block 写入的 CHIP SN/LOTID/wafer ID 等。关于 UID 、 CHIPID 、 SN 、 SOCID 几个名词的 区别。来的值,保证每颗芯片都不一样;信息)、 IMPL_ID 等标记于寄存器上的芯片信息;

2024-06-13 15:23:46 725

原创 内核存储框架了解

2024-06-13 15:18:57 121

原创 类android设备reset过程

模式解析流程frameworks/base/core/java/android/os/PowerManager.javaframeworks/base/services/core/java/com/android/server/power/PowerManagerService.java把reason存储到SystemProperties,最后调用ShutdownThread带着reason传参frameworks/base/services/core/java/com/android/serve

2024-06-13 15:17:17 762

原创 u-boot启动第二阶段 Board.c

2024-06-13 14:54:03 106

原创 使用python完成一个定时从版本库下载daily版本

【代码】使用python完成一个定时从版本库下载daily版本。

2024-06-13 14:42:00 210

原创 u-boot启动第一阶段 Start.S

从start.s中构建异常向量表,然后到lowlevel中,然后完成2到7,之后再再ram中做栈重定位动作,建立mmu,最后跳转到ddr。从sram的uboot的第一阶段跳转到ddr下的uboot的第二阶段地址(不直接从ram中完成uboot是因为ram空间有限)

2024-06-13 11:40:28 176

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除