android lk解读 (3)------uart的初始化

接下来看

void target_early_init(void)
{
#if WITH_DEBUG_UART
	uart_dm_init(2, 0, BLSP1_UART1_BASE);
#endif
}
然后看

void uart_dm_init(uint8_t id, uint32_t gsbi_base, uint32_t uart_dm_base)
{
	static uint8_t port = 0;
	char *data = "Android Bootloader - UART_DM Initialized!!!\n";

	/* Configure the uart clock */
	clock_config_uart_dm(id);
	dsb();

	/* Configure GPIO to provide connectivity between UART block
	   product ports and chip pads */
	gpio_config_uart_dm(id);
	dsb();

	/* Configure GSBI for UART_DM protocol.
	 * I2C on 2 ports, UART (without HS flow control) on the other 2.
	 * This is only on chips that have GSBI block
	 */
	 if(gsbi_base)
		writel(GSBI_PROTOCOL_CODE_I2C_UART <<
			GSBI_CTRL_REG_PROTOCOL_CODE_S,
			GSBI_CTRL_REG(gsbi_base));
	dsb();

	/* Configure clock selection register for tx and rx rates.
	 * Selecting 115.2k for both RX and TX.
	 */
	writel(UART_DM_CLK_RX_TX_BIT_RATE, MSM_BOOT_UART_DM_CSR(uart_dm_base));
	dsb();

	/* Intialize UART_DM */
	msm_boot_uart_dm_init(uart_dm_base);

	msm_boot_uart_dm_write(uart_dm_base, data, 44);

	ASSERT(port < ARRAY_SIZE(port_lookup));
	port_lookup[port++] = uart_dm_base;

	/* Set UART init flag */
	uart_init_flag = 1;
}
仔细看里面的

void clock_config_uart_dm(uint8_t id)
{
	int ret;
	char iclk[64];
	char cclk[64];

	snprintf(iclk, sizeof(iclk), "uart%u_iface_clk", id);
	snprintf(cclk, sizeof(cclk), "uart%u_core_clk", id);

	ret = clk_get_set_enable(iclk, 0, 1);
	if(ret)
	{
		dprintf(CRITICAL, "failed to set %s ret = %d\n", iclk, ret);
		ASSERT(0);
	}

	ret = clk_get_set_enable(cclk, 7372800, 1);
	if(ret)
	{
		dprintf(CRITICAL, "failed to set %s ret = %d\n", cclk, ret);
		ASSERT(0);
	}
配置gpio

/* Configure gpio for blsp uart 2 */
void gpio_config_uart_dm(uint8_t id)
{
	/* configure rx gpio */
	gpio_tlmm_config(5, 2, GPIO_INPUT, GPIO_NO_PULL,
				GPIO_8MA, GPIO_DISABLE);

	/* configure tx gpio */
	gpio_tlmm_config(4, 2, GPIO_OUTPUT, GPIO_NO_PULL,
				GPIO_8MA, GPIO_DISABLE);
}
其实就是往一块内存里写值,因为已经完成了gpio内存映射
void gpio_tlmm_config(uint32_t gpio, uint8_t func,
			uint8_t dir, uint8_t pull,
			uint8_t drvstr, uint32_t enable)
{
	uint32_t val = 0;
	val |= pull;
	val |= func << 2;
	val |= drvstr << 6;
	val |= enable << 9;
	writel(val, (uint32_t *)GPIO_CONFIG_ADDR(gpio));
	return;
}

其实都是按照urat的spec来往register里写一堆东西



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ATK-USB-UART-V1.2是一款USB转串口模块,可以将USB接口转换为串口接口,用于连接串口设备。使用方法如下: 1.将ATK-USB-UART-V1.2插入电脑的USB接口,系统会自动识别并安装驱动程序。 2.将串口设备的TX、RX、GND等引脚连接到ATK-USB-UART-V1.2的对应引脚上。 3.打开串口调试助手软件,选择对应的串口号和波特率,即可进行串口通信。 注意事项: 1.在连接串口设备之前,需要确认串口设备的TX、RX、GND等引脚的接线情况。 2.在使用过程中,需要注意串口设备的波特率、数据位、停止位、校验位等参数的设置,以保证通信的正确性。 3.在使用过程中,如果出现通信异常,可以通过调整串口设备的参数或者更换串口线等方式进行排查。 ### 回答2: ATK-USB-UART-V1.2是一款USB转UART转换器,主要用于将电脑的USB接口转换成串口通信接口,使得电脑可以通过串口与外部设备进行通信。它内置了USB转串口芯片CH340,可以实现对外部串口设备的连接和控制。 具体使用方法如下: 1. 安装驱动程序 插上ATK-USB-UART-V1.2后,电脑会自动识别并安装驱动程序。如果电脑没有自动安装,可以手动安装驱动程序。ATK-USB-UART-V1.2的驱动程序可以在官网上下载。 2. 连接设备 将ATK-USB-UART-V1.2插入电脑的USB接口,根据需要连接串口设备。ATK-USB-UART-V1.2的杜邦线可以连接到外部串口设备上。 3. 配置串口参数 使用串口通信需要配置串口参数,包括串口号、波特率、数据位、校验位、停止位等。一般情况下,串口参数需要与外部设备的参数相匹配。在Windows系统下,可以在设备管理器中查看端口号,然后在串口调试助手等工具中配置串口参数。 4. 打开串口 将串口调试助手等工具打开后,选中串口号,配置好串口参数后,就可以打开串口。在打开串口之前,需要先插上ATK-USB-UART-V1.2。 5. 与外部设备进行通信 在打开串口之后,就可以与外部设备进行通信了。可以发送数据包到外部设备,也可以接收外部设备发送过来的数据包。 总之,ATK-USB-UART-V1.2可以完成电脑与外部串口设备的连接和通信。只需要按照上述步骤进行操作,就可以使用该设备了。 ### 回答3: atk-usb-uart-v1.2是一种USB转UART串口模块,用于在计算机和串口设备之间进行通讯。使用该模块需要遵循以下步骤: 1. 连接硬件 atk-usb-uart-v1.2模块有两个端口,一个是USB端口,一个是串口端口。将USB端口连接到计算机的USB接口上,串口端口连接到串口设备的串口上。 2. 安装驱动程序 该模块需要与计算机配合使用,因此需要安装驱动程序。打开操作系统的设备管理器,在无符号设备中找到atk-usb-uart-v1.2模块,右键选择“更新驱动程序软件”,通过在线更新或手动选择驱动程序来安装驱动程序。 3. 配置串口参数 串口参数包括波特率、数据位、停止位、校验位等。要使用atk-usb-uart-v1.2模块进行通讯,需要将计算机的串口参数配置与串口设备相同,以确保通讯正常。 4. 调用串口API 在程序中调用串口API,通过读写串口的数据来实现通讯。在Windows系统中,可以使用Windows API或第三方库函数来实现串口通讯。 以C/C++为例,以下是一个使用atk-usb-uart-v1.2模块进行串口通讯的示例程序: ``` c++ #include <Windows.h> int main() { HANDLE hComm; // 串口句柄 char lpBuffer[10] = "Hello"; // 发送的数据 DWORD bytesWritten, bytesRead; // 发送数据长度和读取数据长度 COMMTIMEOUTS timeouts; // 串口超时时间结构体 DCB dcb; // 串口配置结构体 hComm = CreateFile(TEXT("COM1"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); // 打开串口 if (hComm == INVALID_HANDLE_VALUE) { printf("Open COM Port Failed!\n"); return 0; } dcb.DCBlength = sizeof(DCB); GetCommState(hComm, &dcb); // 获取串口配置 dcb.BaudRate = CBR_9600; // 设置波特率为9600 dcb.ByteSize = 8; // 设置数据位为8位 dcb.Parity = NOPARITY; // 设置无校验位 dcb.StopBits = ONESTOPBIT; // 设置停止位为1位 SetCommState(hComm, &dcb); // 配置串口 timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.ReadTotalTimeoutConstant = 200; timeouts.WriteTotalTimeoutMultiplier = 10; timeouts.WriteTotalTimeoutConstant = 200; // 设置串口超时 SetCommTimeouts(hComm, &timeouts); WriteFile(hComm, lpBuffer, 5, &bytesWritten, NULL); // 向串口发送数据 ReadFile(hComm, lpBuffer, 10, &bytesRead, NULL); // 读取串口数据 CloseHandle(hComm); // 关闭串口 return 0; } ``` 以上就是atk-usb-uart-v1.2模块的使用步骤,需要注意的是,不同的操作系统和编程语言可能存在细微差别,具体使用时需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值