使用quilt内核打补丁的步骤
1、quilt简介
quilt是一个轻量级的版本控制工具
常用命令如下:
quilt series:查看所有的patch
注意点:需要在对应驱动下的目录下使用该命令查看
quilt top:查看栈顶的patch,一般在自己添加一个patch后进行查看检查
quilt applied:查看已应用的patch
quilt unapplied:查看未应用的patch
quilt files:查看patch关联的文件:
quilt diff:对比修改文件
不添加参数会对所有的文件进行对比输出
其他常用命令:
quilt new:新建patch文件:需要将patch文件的名字考虑好,新建patch后名字将不可更改
quilt remove:解除文件与patch的关联。操作后patch中针对此文件的diff内容会从patch中删除。
quilt push:patch入栈。即选择patch并应用,或者说导入patch。
quilt pop:patch出栈。撤销,导出patch,patch文件并不删除。
quilt import:从其他地方导入patch
quilt edit:编辑当前文件,包含了quilt add操作,并针对top patch。首次使用会提示选择编辑器
quilt refresh:保存当前的patch
实战操作
对驱动文件增加补丁:
·make target/linux/clean
进入OpenWrt目录,将内核清楚干净,该操作会将生产的驱动文件清楚干净
执行后linux-3.10.14的目录被移除
·make target/linux/prepare
将内核应用所有patch并生成最新代码到build_dir目录下
执行后内核从新加载出来:
·cd build_dir/linux-ar71xx_generic/linux-3.3.8
进入最新kernel的source code目录。
·quilt new platform/965-ipheth-iphone5-6-support.patch
新建965-ipheth-iphone5-6-support.patch,并指定保存目录到patches/platform/下
现在可以使用quilt top查看新添加的patch
·quilt edit drivers/net/wireless/mt_wifi/embedded/common/cmm_info.c
编辑需要更改的文件
此时进入了这个nano的编辑器
修改后
·quilt refresh
保存patch。
在可以进入到自己的patches目录下对修改进行查看。
·make target/linux/update V=99
进入Openwrt目录, make target/linux/update V=99,将patch应用,此时会生成新patch,到target/linux/ar71xx/patches-3.3/下查看。
Index: linux-3.10.14/drivers/net/wireless/mt_wifi/embedded/common/cmm_info.c
===================================================================
--- linux-3.10.14.orig/drivers/net/wireless/mt_wifi/embedded/common/cmm_info.c
+++ linux-3.10.14/drivers/net/wireless/mt_wifi/embedded/common/cmm_info.c
@@ -3209,6 +3209,47 @@ RTMP_STRING *GetAuthMode(CHAR auth)
*/
#define LINE_LEN (4+33+20+23+9+7+7+3) /* Channel+SSID+Bssid+Security+Signal+WiressMode+ExtCh+NetworkType*/
+INT AtoHex(CHAR c)
+{
+ if (c >= 'A' && c <= 'F')
+ return (c - 'A' + 0x0A);
+ if (c >= 'a' && c <= 'f')
+ return (c - 'a' + 0x0a);
+ if (c >= '0' && c <= '9')
+ return (c - '0');
+ return -1;
+}
+
+VOID SsidTranslateHex(CHAR *in,CHAR *out)
+{
+ if(strncmp(in,"0x",2) == 0)
+ {
+ UCHAR c;
+ CHAR c1,c2;
+ CHAR *pc = in+2; //skip the 0x
+ int x = 0;
+ char tmpbuf[200];
+ memset(tmpbuf,0,sizeof(tmpbuf));
+ while(pc && *pc && *(pc+1))
+ {
+ if((c1 = AtoHex(*pc)) < 0)
+ break;
+ if((c2 = AtoHex(*(pc+1))) < 0)
+ break;
+ c1 &=0x0f;
+ c2 &=0x0f;
+
+ c = c1 << 4 | c2;
+ tmpbuf[x] = c;
+ x++;
+ pc +=2;
+ }
+ sprintf(out, "0x");
+ strcpy(out,tmpbuf);
+ }
+ return;
+}
+
VOID RTMPCommSiteSurveyData(
IN RTMP_STRING *msg,
IN BSS_ENTRY *pBss,
@@ -3218,6 +3259,7 @@ VOID RTMPCommSiteSurveyData(
UINT Rssi_Quality = 0;
NDIS_802_11_NETWORK_TYPE wireless_mode;
CHAR Ssid[MAX_LEN_OF_SSID +1];
+ CHAR Ssid1[(MAX_LEN_OF_SSID + 1)*2];
RTMP_STRING SecurityStr[32] = {0};
/*Channel*/
@@ -3231,9 +3273,11 @@ VOID RTMPCommSiteSurveyData(
else
{
INT idx = 0;
- sprintf(Ssid, "0x");
- for (idx = 0; (idx < 14) && (idx < pBss->SsidLen); idx++)
- sprintf(Ssid + 2 + (idx*2), "%02X", (UCHAR)pBss->Ssid[idx]);
+ sprintf(Ssid1, "0x");
+ //for (idx = 0; (idx < 14) && (idx < pBss->SsidLen); idx++)
+ for (idx = 0;(idx < MAX_LEN_OF_SSID) && (idx < pBss->SsidLen);idx++) //change by ly 20200224
+ sprintf(Ssid1 + 2 + (idx*2), "%02X", (UCHAR)pBss->Ssid[idx]);
+ SsidTranslateHex(Ssid1,Ssid);
}
sprintf(msg+strlen(msg),"%-33s", Ssid);
参考来源:https://blog.csdn.net/wgl307293845/article/details/90369789
https://blog.csdn.net/lixiaofeng0/article/details/113735830
十分感谢
------------------------------------------------------------------------------------------------------------------------------
打了一天的补丁总算把补丁搞定了,在linux内核外需要补丁的地方,可以将文件一到内核中来先生成一个patch在将patch放到对应的地方去。