android uboot获取mac地址,uboot生成随机的MAC地址

uboot生成随机的MAC地址

R.wen

由于设备量产需要每台机器的MAC地址都不一样,所以我们给Uboot增加一个环境变量sysready,用来表示如果系统没有ready,就做一些额外的初始化工作,如生成一个随机的MAC地址,并保存到环境变量中。

一、 在s2410中找一个随机源也不容易,它不像x86一样有个硬件计数器可以作为随机源。这里我们使用了s2410的timer,经过测试也可以得到很好的随机数。

Timer部分的代码在cpu/arm920t/s24x0/interrupt.c中,首先要在lib_arm/board.c的初始化函数中加入初始化定时器的函数:

interrupt_init ();

接着就可以通过

Ret = get_ticks();

得到中断计数和。

由于系统总有一些不确定因素的影响,所以总会得到不同的计数和。

二、得到随机数

上面得到的随机数值差别非常小,但是经过下面的计算,就可以得到看起来很随机的数。

static unsigned char random(void)

{

unsigned long long rand = get_ticks() * 100000;

unsigned char a;

//   See "Numerical Recipes in C", second edition, p. 284

rand = rand * + ;

a = rand >> 24; //不是最低8位

//为了得到 ‘0~9, a ~ f, A ~ F’ 的值

if (a < 'A')

a = a % 10 + 48;

else if (a < 'F')

a = a % 6 + 65;

else if (a < 'a' || a > 'f')

a = a % 6 + 97;

return a;

}

三、设置随机MAC地址:

s = getenv("sysready");

sysready = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;

if (sysready == 0) /* system not ready */

{

/*set mac addr */

char mac[18]={'0','0',};

int i;

for (i=3; i<17; i++)

{

udelay(10);

mac= random();

}

mac[2] = mac[5] = mac[8] = mac[11] = mac[14] = ':';

mac[17] = '\0';

setenv("ethaddr", mac);

setenv("sysready", "1");

saveenv();

}

四、应用

完成了上面的设置之后, 在系统第一次加载的时候,由于sysready为0,所以会重新生成一个随机的MAC地址,随后uboot会将sysready置为1。

如果需要重新生成一个MAC地址,则只需要将sysready重置为0,然后保存环境变量即可,即执行:

setenv sysready 0; saveenv

STM32F407串口DMA (Direct Memory Access) 收发 HAL 库示例通常是在嵌入式开发中用于高效处理大量数据传输的应用。HAL (Hardware Abstraction Layer) 提供了对硬件设备如USART (通用同步异步接收发送器) 的高级访问层,包括DMA的支持,使得CPU能够专注于其他任务。 在STM32F407上使用HAL库进行串口DMA操作的一般步骤包括: 1. 初始化USART:首先,你需要配置串口的基本设置,如波特率、数据位数、校验位等,并开启DMA功能。 ```c HAL_UART_Init(&huart1); HAL_UART_SetDMA(&huart1, &hdma_usart1_rx, &hdma_usart1_tx); ``` 2. 配置DMA:定义并初始化RX/TX DMA,指定源地址(内存)、目的地(串口接收缓冲区或发送缓冲区)。 ```c HAL_DMA_Start_IT(&hdma_usart1_rx, (__HAL_DMA_GET_SOURCE(UART_HandleTypeDef huart1)), (__HAL_DMA_GET_MEMORY_TO(__HANDLE(huart1))), &huart1->hdmarx, (uint16_t)&usart_buffer, usart_dma_buffersize, DMA_DIR_PERIPH_TO_MEMORY); ``` 3. 开启中断服务程序:注册DMA完成中断处理函数,并启用串口接收中断。 ```c __HAL_NVIC_EnableIRQ(USART1_IRQn); ``` 4. 设置DMA传输模式:例如半双工通信,需要同时配置发送和接收。 5. 主循环中检查和响应中断:当串口接收缓冲区有数据可用或者DMA传输完成时,会触发中断,你可以在这里读取接收到的数据并处理发送请求。 ```c while (1) { if (HAL_DMA_GetState(&hdma_usart1_rx) == HAL_DMA_STATE_COMPLETED) { // 处理接收到的数据... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值