- 博客(18)
- 资源 (1)
- 收藏
- 关注
原创 cortext-A7支持optee问题
通过上面的分析可以说明是IRQ向量引发的data abort,而且data abort后执行的地址是0xFFFF000C,说明optee里初始化的VBAR没有起作用,导致异常向量表在0xFFFF0000处,这里是我们的romcode,FPGA验证阶段的romcode没有设置IRQ的异常向量,导致IRQ发生后程序跑飞出现data abort。然后检查出错后的寄存器可以发现IRQ的R14寄存器正是"出错前的地址+8",所以说明打开IRQ和FIQ后立马进入了IRQ然后才发生的data abort。
2025-05-16 16:08:42
6
原创 linux pcie【5】- ep控制器驱动介绍
addr_space空间主要为outbound使用,717-738行, ep->phys_base保存addr_space的物理地址,其实就是outbound访问的物理基地址,ep->ob_window_map保存outbound访问的虚拟地,ep->outbound_addr用来保存outbound访问实际分配的物理地址。cpu 访问pci上的地址空间时,使用的是ob_window_map虚拟地址,然后转换为outbound_addr物理地址,最后通过outbound寄存器转换为pci总线地址。
2025-05-09 17:36:22
360
原创 linux pcie【4】- msi irq介绍
pp->msi_domain的parent为pp->irq_domain,对应的irq_chip为dw_pcie_msi_irq_chip,但是dw_pcie_msi_irq_chip并没有定义irq_write_msi_msg,这个会在pci_msi_domain_update_chip_ops里被赋值。我们先看一下pp->irq_domain,它的irq_domain_ops为dw_pcie_msi_domain_ops,对应的irq_chip为dw_pci_msi_bottom_irq_chip。
2025-04-29 19:55:06
486
1
原创 linux pcie【3】- device驱动介绍
pci_device_id的定义如下,控制器驱动扫描设备时会读取出设备配置空间里的Vendor ID, Device ID, Subsystem vendor ID, Subsystem device ID 等信息用来和pci_device_id里的对应字段匹配,配置成功后绑定相应的驱动。pci设备驱动使用pci_driver表示一个pci设备驱动。pci_device_id用来匹配一个pci_dev,probe和remove为驱动绑定和解绑的回调。下面介绍一些常用的api接口。
2025-04-24 19:30:47
327
原创 linux pcie【2】- rc控制器驱动介绍
接着来先看一下pci_host_bridge里的 child_ops,这里主要看一下dw_pcie_other_conf_map_bus,这个函数。pci_scan_device里会先读取vendor_id, 然后是调用pci_alloc_dev申请pci_dev设备,最后调用pci_setup_device配置设备。pci_register_host_bridge用来注册host bridge, pci_scan_child_bus用来扫描添加host bridge下的所有bus上的设备。
2025-04-22 18:23:14
1064
原创 linux pcie 【1】- 控制器介绍
主要有两种形式, 一种是IC集成的时候带AXI bridge,一种是不带AXI bridge(Native PCIe controller),一般arm soc集成的时候会配置成带AXI bridge这种形式,这样就就不用再处理控制器内部自定义的总线。本文主要介绍一下新思的PCIE控制器。首先看一下硬件控制器的框图。
2025-04-07 14:38:59
539
原创 Linux usb【4】- gadget configfs介绍
usb_add_config_only主要就是将config_usb_cfg->usb_configuration 结构挂到gadget_info->usb_composite_dev->configs链表上,同时将config_usb_cfg->usb_configuration->usb_composite_dev赋值为gadget_info->usb_composite_dev,并将这个配置描述符里的接口描述符清0。有了这个usb_ep结构,uac2驱动就可以使用它进行数据收发了。
2025-01-22 17:26:20
1617
原创 Linux usb【3】- gadget驱动介绍
在dwc3_gadget_init中主要就是调用dwc3_gadget_init_endpoints初始化ep, 并且申请了usb_gadget数据结构,并初始化里面的usb_gadget_ops回调函数, 然后调用usb_add_gadget。usb device设备对应的驱动是usb_gadget_driver ,这个驱动是在usb_gadget_probe_driver里面根据控制器名字绑定的,usb_gadget_probe_driver何时调用我们会在随后的文章中介绍。
2025-01-20 18:05:23
733
原创 Linux usb【2】- hub 驱动介绍
然后调用kick_hub_wq,用来处理刚上电时hub的端口状态。hub_probe里主要就是分配了一个usb_hub结构,并且注册了一个events工作队列和一个rq_urb_retry定时器,events工作队列主要用来出来hub的一些插拔事件,rq_urb_retry用来向hub发送hub->urb失败后通过定时器回调重新发送。再看下hub_irq,它除了调用kick_hub_wq,还会调用hub_resubmit_irq_urb,再次发送hub->urb用来轮询hub状态。
2025-01-03 17:25:02
806
原创 zephyr介绍
这样的线程成为了当前线程后,它可以在任何时刻被协作式线程或者优先级更高(或相等)的抢占式线程替代。同一个内存片上面的所有内存块的尺寸是固定(相同)的,这样做的好处是可以高效地分配和释放,避免了内存碎片问题。基于单链表实现的异步传输。消息队列(message queue) 是一个内核对象,它实现了一个简单的消息队列,允许线程和 ISR 异步地发送和接收大小固定的数据项。用户之间的memory是隔离的, 加到同一个memory domain的线程才可以共享同一domain的memory partition。
2024-11-27 15:16:30
127
原创 linux DMA框架【3】-DMA map操作
当我们希望通过DMA访问DDR时,就要考虑两个问题,一就是DMA访问DDR的地址是什么,还有就是DMA访问的这块DDR空间CPU也会访问时,如何做缓存一致性。linux kernel抽象出dma map操作就是用来解决这两个问题的。为了提高性能cpu或者某些高速设备会使用cache,由于会存在cpu和设备访问同一个DDR空间的可能,这就会引入cache一致性问题,所以kernel使用dma map操作来解决这个问题,屏蔽底层的差异。
2024-11-18 17:14:12
1598
原创 linux crypto框架
crypto_alg,定义了一个crypto所有支持算法的基类, 所有算法结构除了定义自己特殊的一些成员,都会包含crypto_alg这个结构, alg其实就是对应的具体算法的现,它会对应到cipher engine内的一个算法实体,这个实体驱动就是通过实现alg里的回调来实现的。cypto_queue的list就用用来挂载所有的request的,如果所有的requet的数量大于max_qlen, 新提交的request会从第一个开始,被backlog记录下来,并返回一个-EBUSY错误。
2024-11-15 17:02:04
1351
原创 linux dma框架【2】-peripheral和dma request id的绑定
client申请channel时直接使用dma_request_channel来申请一个channel, 它在参数里需要一个filter回调来帮助选择一个合适的channel,然后通过dmaengine_slave_config配置这个channel时,将dma_slave_config里的slave_id成员设置为对应的request id,这当然需要dma控制器驱动的支持。of_dma_controller_register就是用来注册of_dma结构的,它被挂到of_dma_list全局链表里。
2024-11-04 18:46:54
617
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人