AMBA 3 AHB-Lite协议中文版详解

需积分: 50 80 下载量 40 浏览量 更新于2024-07-15 收藏 1.68MB PDF 举报
"AMBA 3.0 AHB-Lite协议中文版1.0.pdf" 本文档详细介绍了AMBA 3.0 AHB-Lite协议,这是由ARM公司开发的一种高性能总线接口标准,适用于嵌入式系统设计。AHB-Lite是AHB(Advanced High-performance Bus)的简化版本,旨在提供一种低开销、高效率的片上通信机制。 首先,协议手册阐述了AMBA 3.0 AHB-Lite的基本概念。协议涉及的主要组件包括主设备、从设备、译码器和多路器。主设备是发起传输的模块,如处理器或DMA控制器;从设备接收传输,通常是存储器或外设;译码器用于将总线地址映射到特定的从设备;而多路器则允许多个主设备共享一个或多个从设备。 操作方面,协议定义了不同类型的传输,包括基本传输、传输类型(如单次传输、连续传输和锁定传输)、传输大小以及Burst操作。Burst操作允许数据以连续的突发方式进行传输,可以提高数据吞吐量。同时,协议还详细说明了Burst操作的终止条件,例如BUSY状态下的Burst终止、提前终止等,并给出了Burst操作的例子。 等待传输是协议中的另一个关键概念,它允许从设备在无法立即响应主设备请求时设置等待状态。在此期间,主设备可能会改变传输类型或地址,这些情况在协议中都有明确的规定。 总线互连部分详细描述了地址译码过程,包括如何设置默认从设备以及如何实现多层总线互连,以支持更复杂的系统架构。此外,协议还讨论了从设备的响应信号,包括传输完成、挂起和错误响应,这些信号对于确保正确性和异常处理至关重要。 数据总线部分涵盖了读写操作、大小端处理以及如何在不同宽度的总线上兼容不同位宽的设备。时钟和复位章节规定了时钟信号的要求,包括同步和异步复位,以确保系统的稳定运行。 最后,术语部分提供了协议中使用的专业术语的定义,帮助读者更好地理解文档内容。通过这个详细的协议手册,设计者可以有效地理解和实现基于AMBA 3.0 AHB-Lite的嵌入式系统接口。

struct ring_buffer { int head; int tail; struct msg *data; int size; unsigned int capacity; }; struct msg { u16 module_id; u16 cmd_id; u16 cmd_subid; u16 complete; u8 data[128]; };struct pokemon_uart_port { struct uart_port port; struct clk *clk; const struct vendor_data vendor; unsigned int im; / interrupt mask / unsigned int old_status; unsigned int fifosize; unsigned int old_cr; / state during shutdown */ unsigned int fixed_baud; struct ring_buffer tx_buf; struct ring_buffer rx_buf; char type[12]; };struct ring_buffer ring_buffer_init(unsigned int capacity) { struct ring_buffer rbuf=kmalloc(sizeof(struct ring_buffer),GFP_KERNEL); rbuf->capacity=capacity; rbuf->head = rbuf->size=0; rbuf->tail = capacity - 1; rbuf->data = kmalloc(rbuf->capacity * sizeof(struct msg), GFP_KERNEL); printk(KERN_DEBUG "ring_buffer create successfully!/n"); return rbuf; }static int pokemon_uart_probe(struct amba_device *dev, const struct amba_id *id) { struct pokemon_uart_port *pup; struct vendor_data *vendor = id->data; int portnr, ret; portnr = pokemon_find_free_port(); if (portnr < 0) return portnr; pup = devm_kzalloc(&dev->dev, sizeof(struct pokemon_uart_port), GFP_KERNEL); if(!pup) return -ENOMEM; pup->clk = devm_clk_get(&dev->dev, NULL); if(IS_ERR(pup->clk)) return PTR_ERR(pup->clk); pup->port.irq = dev->irq[0]; pup->port.line = portnr; pup->vendor = vendor; pup->fifosize = 32; pup->port.iotype = pup->vendor->access_32b ? UPIO_MEM32 : UPIO_MEM; pup->port.ops = &pokemon_uart_ops; snprintf(pup->type, sizeof(pup->type), "PL011 rev%u", amba_rev(dev)); pup->tx_buf = ring_buffer_init(10); pup->rx_buf = ring_buffer_init(10); ret = pokemon_setup_port(&dev->dev, pup, &dev->res, portnr); if (ret) return ret; amba_set_drvdata(dev, pup); return pokemon_register_port(pup); }检查一下这段linux内核驱动代码中,有无代码逻辑和格式错误,如果有,请给出修改之后的代码

2023-06-08 上传

static int sbsa_uart_probe(struct platform_device *pdev) { struct uart_amba_port *uap; struct resource *r; int portnr, ret; int baudrate; /* * Check the mandatory baud rate parameter in the DT node early * so that we can easily exit with the error. */ if (pdev->dev.of_node) { struct device_node *np = pdev->dev.of_node; ret = of_property_read_u32(np, "current-speed", &baudrate); if (ret) return ret; } else { baudrate = 115200; } portnr = pl011_find_free_port(); if (portnr < 0) return portnr; uap = devm_kzalloc(&pdev->dev, sizeof(struct uart_amba_port), GFP_KERNEL); if (!uap) return -ENOMEM; ret = platform_get_irq(pdev, 0); if (ret < 0) { if (ret != -EPROBE_DEFER) dev_err(&pdev->dev, "cannot obtain irq\n"); return ret; } uap->port.irq = ret; #ifdef CONFIG_ACPI_SPCR_TABLE if (qdf2400_e44_present) { dev_info(&pdev->dev, "working around QDF2400 SoC erratum 44\n"); uap->vendor = &vendor_qdt_qdf2400_e44; } else #endif uap->vendor = &vendor_sbsa; uap->reg_offset = uap->vendor->reg_offset; uap->fifosize = 32; uap->port.iotype = uap->vendor->access_32b ? UPIO_MEM32 : UPIO_MEM; uap->port.ops = &sbsa_uart_pops; uap->fixed_baud = baudrate; snprintf(uap->type, sizeof(uap->type), "SBSA"); r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ret = pl011_setup_port(&pdev->dev, uap, r, portnr); if (ret) return ret; platform_set_drvdata(pdev, uap); return pl011_register_port(uap); }linux内核uart驱动在设备注册时,使用acpi表定义的波特率来初始化串口,请根据我的要求和上述代码,在代码中添加这一功能

2023-06-07 上传