出來混遲早要還的,夜路走多了總會碰到…。firmware 玩多了總有搞掛的時候,所以廠商要求我們要在 bootcode 裡面提供 firmware upgrade 的功能,而且還是要 web UI。
我們實際上的作法是因為前人有作過,所以就依樣畫葫蘆的搬過來用。不過這我就不寫的太仔細了。
那 open source 的世界裡有沒有什麼人提出解決方案呢?我有找到一個:
https://github.com/pepe2k/u-boot_mod
它有 support web server
https://github.com/pepe2k/u-boot_mod#web-server
2014年9月3日 星期三
2014年1月28日 星期二
變數的長度及 printf 參數。
今天要把 MAC address 由字串轉成 16 進制數字時,才發現很麻煩。因為它是 6 個 bytes,太長了。尋找解決的過程經歷了一些故事,所以來記錄一下。
其實之前有碰到 memory address 的部份,由使用者輸進來的是字串,但運算時常常需要把它轉成 16 進制數字。在我手上的程式一般是使用 simple_strtoul 這個函式,但是它的傳回值是 unsigned long ,只有 4 個 bytes,所以長度不夠。
其實之前有碰到 memory address 的部份,由使用者輸進來的是字串,但運算時常常需要把它轉成 16 進制數字。在我手上的程式一般是使用 simple_strtoul 這個函式,但是它的傳回值是 unsigned long ,只有 4 個 bytes,所以長度不夠。
2013年12月25日 星期三
printf 印出 IP address
最近 trace code(u-boot) 時發現,printf 現在可以印出 IP 及 MAC 之類的 address 型態。
%pI4:印出IPv4位址,變數型態為 unsigned long 的指標。
%pI6:印出IPv6位址,變數型態為 unsigned ling 的指標。
%pM:印出MAC位址,變數型態為 unsigned char 的指標。
這樣它就可以直接把 IP, MAC address 印出來。
EX:
typedef ulong IPaddr_t;
IPaddr_t NetOurSubnetMask;
printf("NetOurSubnetMask : %pI4\n", &NetOurSubnetMask);
unsigned char env_enetaddr[6];
printf("Address in environment is %pM\n", env_enetaddr);
而變數裡面的值,IP的部份就是16進制的值直接連在一起。
例如:
192.168.10.100 => C0A80A64
192 = C0
168 = A8
10 = 0A
100 = 64
MAC 的部份也是一樣是16進制的值,所以用 %s、%c會印不出來。
反而直接用%x一個一個去印是印得出來的。
這功能原本可能來自新版的 Linux Kernel 的 printk
參考:
https://www.kernel.org/doc/Documentation/printk-formats.txt
%pI4:印出IPv4位址,變數型態為 unsigned long 的指標。
%pI6:印出IPv6位址,變數型態為 unsigned ling 的指標。
%pM:印出MAC位址,變數型態為 unsigned char 的指標。
這樣它就可以直接把 IP, MAC address 印出來。
EX:
typedef ulong IPaddr_t;
IPaddr_t NetOurSubnetMask;
printf("NetOurSubnetMask : %pI4\n", &NetOurSubnetMask);
unsigned char env_enetaddr[6];
printf("Address in environment is %pM\n", env_enetaddr);
而變數裡面的值,IP的部份就是16進制的值直接連在一起。
例如:
192.168.10.100 => C0A80A64
192 = C0
168 = A8
10 = 0A
100 = 64
MAC 的部份也是一樣是16進制的值,所以用 %s、%c會印不出來。
反而直接用%x一個一個去印是印得出來的。
這功能原本可能來自新版的 Linux Kernel 的 printk
參考:
https://www.kernel.org/doc/Documentation/printk-formats.txt
訂閱:
文章 (Atom)