Last-Modified: Sun, 30 Mar 2025 11:46:50 GMT
Expires: Wed, 28 Mar 2035 11:46:50 GMT

<!DOCTYPE html>
<html lang='en'>
<head>
<title>avr/qmk/firmware - [no description]</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='http://git.panaceas.org/cgit.cgi/avr/qmk/firmware/atom/keyboards/8pack/rev11/config.h?h=master' type='application/atom+xml'/>
<link rel='vcs-git' href='git://git.panaceas.org/avr/qmk/firmware' title='avr/qmk/firmware Git repository'/>
<link rel='vcs-git' href='ssh://git@git.panaceas.org/git/avr/qmk/firmware' title='avr/qmk/firmware Git repository'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/cgit.cgi/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/cgit.cgi/'>index</a> : <a title='avr/qmk/firmware' href='/cgit.cgi/avr/qmk/firmware/'>avr/qmk/firmware</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='1f2807c2deb0f90222090537feca38682c9aa5b5'/><select name='h' onchange='this.form.submit();'>
<option value='master' selected='selected'>master</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>[no description]</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit.cgi/avr/qmk/firmware/about/'>about</a><a href='/cgit.cgi/avr/qmk/firmware/'>summary</a><a href='/cgit.cgi/avr/qmk/firmware/refs/?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>refs</a><a class='active' href='/cgit.cgi/avr/qmk/firmware/log/keyboards/8pack/rev11/config.h'>log</a><a href='/cgit.cgi/avr/qmk/firmware/tree/keyboards/8pack/rev11/config.h?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>tree</a><a href='/cgit.cgi/avr/qmk/firmware/commit/keyboards/8pack/rev11/config.h?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>commit</a><a href='/cgit.cgi/avr/qmk/firmware/diff/keyboards/8pack/rev11/config.h?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>diff</a><a href='/cgit.cgi/avr/qmk/firmware/stats/keyboards/8pack/rev11/config.h'>stats</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/avr/qmk/firmware/log/keyboards/8pack/rev11/config.h'>
<input type='hidden' name='id' value='1f2807c2deb0f90222090537feca38682c9aa5b5'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/avr/qmk/firmware/log/?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>root</a>/<a href='/cgit.cgi/avr/qmk/firmware/log/keyboards?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>keyboards</a>/<a href='/cgit.cgi/avr/qmk/firmware/log/keyboards/8pack?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>8pack</a>/<a href='/cgit.cgi/avr/qmk/firmware/log/keyboards/8pack/rev11?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>rev11</a>/<a href='/cgit.cgi/avr/qmk/firmware/log/keyboards/8pack/rev11/config.h?id=1f2807c2deb0f90222090537feca38682c9aa5b5'>config.h</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/cgit.cgi/avr/qmk/firmware/log/keyboards/8pack/rev11/config.h?id=1f2807c2deb0f90222090537feca38682c9aa5b5&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr><td class='commitgraph'>* </td><td><a href='/cgit.cgi/avr/qmk/firmware/commit/keyboards/8pack/rev11/config.h?id=6766c5315eb89eeafaf60c089ad028a963c48ab1'>[Keyboard] 8 pack (#6031)</a></td><td>gorbachev</td><td><span title='2019-06-01 22:43:00 -0700'>2019-06-01</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+3</span></td></tr>
</table><ul class='pager'></ul></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2025-03-30 11:46:50 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span>The WiFi settings are configured in the file <span class="k">\texttt</span><span class="nb">{</span>/etc/config/wireless<span class="nb">}</span>
(currently supported on Broadcom and Atheros). When booting the router for the first time
it should detect your card and create a sample configuration file. By default &#39;<span class="k">\texttt</span><span class="nb">{</span>option network  lan<span class="nb">}</span>&#39; is
commented. This prevents unsecured sharing of the network over the wireless interface.

Each wireless driver has its own configuration script in <span class="k">\texttt</span><span class="nb">{</span>/lib/wifi/driver<span class="k">\_</span>name.sh<span class="nb">}</span> which handles
driver specific options and configurations. This script is also calling driver specific binaries like wlc for
Broadcom, or hostapd and wpa<span class="k">\_</span>supplicant for atheros.

The reason for using such architecture, is that it abstracts the driver configuration. 

<span class="k">\paragraph</span><span class="nb">{</span>Generic Broadcom wireless config:<span class="nb">}</span>

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
config wifi-device      &quot;wl0&quot;
    option type         &quot;broadcom&quot;
    option channel      &quot;5&quot;

config wifi-iface
    option device       &quot;wl0&quot;
#   option network  lan
    option mode         &quot;ap&quot;
    option ssid         &quot;OpenWrt&quot;
    option hidden       &quot;0&quot;
    option encryption   &quot;none&quot;
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

<span class="k">\paragraph</span><span class="nb">{</span>Generic Atheros wireless config:<span class="nb">}</span>

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
config wifi-device      &quot;wifi0&quot;
    option type         &quot;atheros&quot;
    option channel      &quot;5&quot;
    option agmode  	&quot;11g&quot;

config wifi-iface
    option device       &quot;wifi0&quot;
#   option network  lan
    option mode         &quot;ap&quot;
    option ssid         &quot;OpenWrt&quot;
    option hidden       &quot;0&quot;
    option encryption   &quot;none&quot;
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

<span class="k">\paragraph</span><span class="nb">{</span>Generic multi-radio Atheros wireless config:<span class="nb">}</span>

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
config wifi-device  wifi0
    option type     atheros
    option channel  1

config wifi-iface
    option device   wifi0
#   option network  lan
    option mode     ap
    option ssid     OpenWrt<span class="nb">_</span>private
    option hidden   0
    option encryption none

config wifi-device  wifi1
    option type     atheros
    option channel  11

config wifi-iface
    option device   wifi1
#   option network  lan
    option mode     ap
    option ssid     OpenWrt<span class="nb">_</span>public
    option hidden   1
    option encryption none
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

There are two types of config sections in this file. The &#39;<span class="k">\texttt</span><span class="nb">{</span>wifi-device<span class="nb">}</span>&#39; refers to
the physical wifi interface and &#39;<span class="k">\texttt</span><span class="nb">{</span>wifi-iface<span class="nb">}</span>&#39; configures a virtual interface on top
of that (if supported by the driver).

A full outline of the wireless configuration file with description of each field:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
config wifi-device     wifi device name
    option type     broadcom, atheros
    option country  us, uk, fr, de, etc.
    option channel  1-14
    option maxassoc 1-128 (broadcom only)
    option distance 1-n
    option agmode     11b, 11g, 11a, 11bg (atheros only)

config wifi-iface
    option network  the interface you want wifi to bridge with 
    option device   wifi0, wifi1, wifi2, wifiN
    option mode     ap, sta, adhoc, or wds
    option ssid     ssid name
    option bssid    bssid address
    option encryption none, wep, psk, psk2, wpa, wpa2 
    option key      encryption key
    option key1     key 1
    option key2     key 2
    option key3     key 3
    option key4     key 4
    option server   ip address
    option port     port
    option hidden   0,1
    option isolate  0,1
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

<span class="k">\paragraph</span><span class="nb">{</span>Options for the <span class="k">\texttt</span><span class="nb">{</span>wifi-device<span class="nb">}</span>:<span class="nb">}</span>

<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>type<span class="nb">}</span> <span class="k">\\</span>
        The driver to use for this interface.
	
    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>country<span class="nb">}</span> <span class="k">\\</span>
        The country code used to determine the regulatory settings.

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>channel<span class="nb">}</span> <span class="k">\\</span>
        The wifi channel (e.g. 1-14, depending on your country setting).

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>maxassoc<span class="nb">}</span> <span class="k">\\</span>
        Optional: Maximum number of associated clients. This feature is supported only on the broadcom chipset.

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>distance<span class="nb">}</span> <span class="k">\\</span>
	Optional: Distance between the ap and the furthest client in meters. This feature is supported only on the atheros chipset.

	<span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>mode<span class="nb">}</span> <span class="k">\\</span>
		The frequency band (<span class="k">\texttt</span><span class="nb">{</span>b<span class="nb">}</span>, <span class="k">\texttt</span><span class="nb">{</span>g<span class="nb">}</span>, <span class="k">\texttt</span><span class="nb">{</span>bg<span class="nb">}</span>, <span class="k">\texttt</span><span class="nb">{</span>a<span class="nb">}</span>). This feature is only supported on the atheros chipset.


<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

<span class="k">\paragraph</span><span class="nb">{</span>Options for the <span class="k">\texttt</span><span class="nb">{</span>wifi-iface<span class="nb">}</span>:<span class="nb">}</span>

<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>network<span class="nb">}</span> <span class="k">\\</span>
        Selects the interface section from <span class="k">\texttt</span><span class="nb">{</span>/etc/config/network<span class="nb">}</span> to be
        used with this interface

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>device<span class="nb">}</span> <span class="k">\\</span>
	Set the wifi device name.

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>mode<span class="nb">}</span> <span class="k">\\</span>
        Operating mode:

        <span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
            <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>ap<span class="nb">}</span> <span class="k">\\</span>
                Access point mode

            <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>sta<span class="nb">}</span> <span class="k">\\</span>
                Client mode

            <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>adhoc<span class="nb">}</span> <span class="k">\\</span>
                Ad-Hoc mode

            <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>wds<span class="nb">}</span> <span class="k">\\</span>
                WDS point-to-point link

        <span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>ssid<span class="nb">}</span>
	Set the SSID to be used on the wifi device.

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>bssid<span class="nb">}</span>
	Set the BSSID address to be used for wds to set the mac address of the other wds unit.

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>encryption<span class="nb">}</span> <span class="k">\\</span>
        Encryption setting. Accepts the following values:

        <span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
	    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>none<span class="nb">}</span>
	    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>wep<span class="nb">}</span>
            <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>psk<span class="nb">}</span>, <span class="k">\texttt</span><span class="nb">{</span>psk2<span class="nb">}</span> <span class="k">\\</span>
                WPA(2) Pre-shared Key

            <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>wpa<span class="nb">}</span>, <span class="k">\texttt</span><span class="nb">{</span>wpa2<span class="nb">}</span> <span class="k">\\</span>
                WPA(2) RADIUS
        <span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>key, key1, key2, key3, key4<span class="nb">}</span> (wep, wpa and psk) <span class="k">\\</span>
        WEP key, WPA key (PSK mode) or the RADIUS shared secret (WPA RADIUS mode)

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>server<span class="nb">}</span> (wpa) <span class="k">\\</span>
        The RADIUS server ip address

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>port<span class="nb">}</span> (wpa) <span class="k">\\</span>
        The RADIUS server port

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>hidden<span class="nb">}</span> <span class="k">\\</span>
        0 broadcasts the ssid; 1 disables broadcasting of the ssid

    <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>isolate<span class="nb">}</span> <span class="k">\\</span>
        Optional: Isolation is a mode usually set on hotspots that limits the clients to communicate only with the AP and not with other wireless clients.
        0 disables ap isolation (default); 1 enables ap isolation.

<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>


<span class="k">\paragraph</span><span class="nb">{</span>Limitations:<span class="nb">}</span>

There are certain limitations when combining modes.
Only the following mode combinations are supported:

<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
    <span class="k">\item</span> <span class="k">\textbf</span><span class="nb">{</span>Broadcom<span class="nb">}</span>: <span class="k">\\</span>
        <span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
            <span class="k">\item</span> 1x <span class="k">\texttt</span><span class="nb">{</span>sta<span class="nb">}</span>, 0-3x <span class="k">\texttt</span><span class="nb">{</span>ap<span class="nb">}</span>
            <span class="k">\item</span> 1-4x <span class="k">\texttt</span><span class="nb">{</span>ap<span class="nb">}</span>
            <span class="k">\item</span> 1x <span class="k">\texttt</span><span class="nb">{</span>adhoc<span class="nb">}</span>
        <span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

        WDS links can only be used in pure AP mode and cannot use WEP (except when sharing the
        settings with the master interface, which is done automatically).

    <span class="k">\item</span> <span class="k">\textbf</span><span class="nb">{</span>Atheros<span class="nb">}</span>: <span class="k">\\</span>
        <span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
            <span class="k">\item</span> 1x <span class="k">\texttt</span><span class="nb">{</span>sta<span class="nb">}</span>, 0-4x <span class="k">\texttt</span><span class="nb">{</span>ap<span class="nb">}</span>
            <span class="k">\item</span> 1-4x <span class="k">\texttt</span><span class="nb">{</span>ap<span class="nb">}</span>
            <span class="k">\item</span> 1x <span class="k">\texttt</span><span class="nb">{</span>adhoc<span class="nb">}</span>
        <span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

<span class="k">\paragraph</span><span class="nb">{</span>Adding a new driver configuration<span class="nb">}</span>

Since we currently only support two different wireless drivers : Broadcom and Atheros,
you might be interested in adding support for another driver like Ralink RT2x00, 
Texas Instruments ACX100/111.

The driver specific script should be placed in <span class="k">\texttt</span><span class="nb">{</span>/lib/wifi/&lt;driver&gt;.sh<span class="nb">}</span> and has to
include several functions providing :

<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
	<span class="k">\item</span> detection of the driver presence
	<span class="k">\item</span> enabling/disabling the wifi interface(s)
	<span class="k">\item</span> configuration reading and setting
	<span class="k">\item</span> third-party programs calling (nas, supplicant)
<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

Each driver script should append the driver to a global DRIVERS variable :

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
append DRIVERS &quot;driver name&quot;
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

<span class="k">\subparagraph</span><span class="nb">{</span><span class="k">\texttt</span><span class="nb">{</span>scan<span class="k">\_</span>&lt;driver&gt;<span class="nb">}}</span>

This function will parse the <span class="k">\texttt</span><span class="nb">{</span>/etc/config/wireless<span class="nb">}</span> and make sure there
are no configuration incompatibilities, like enabling hidden SSIDS with ad-hoc mode
for instance. This can be more complex if your driver supports a lof of configuration
options. It does not change the state of the interface.

Example:
<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
scan<span class="nb">_</span>dummy() <span class="nb">{</span>
	local device=&quot;<span class="s">$</span><span class="m">1</span><span class="nb">&quot;</span>

<span class="nb">	config_get vifs &quot;</span><span class="s">$</span>device&quot; vifs
	for vif in <span class="s">$</span><span class="nb">vifs; do</span>
<span class="nb">		# check config consistency for wifi</span><span class="o">-</span><span class="nb">iface sections</span>
<span class="nb">	done</span>
<span class="nb">	# check mode combination</span>
<span class="nb">}</span>
<span class="nv">\end</span><span class="nb">{Verbatim}</span>

<span class="nv">\subparagraph</span><span class="nb">{</span><span class="nv">\texttt</span><span class="nb">{enable</span><span class="nv">\_</span><span class="nb">&lt;driver&gt;}}</span>

<span class="nb">This function will bring up the wifi device and optionally create application specific</span>
<span class="nb">configuration files, e.g. for the WPA authenticator or supplicant.</span>

<span class="nb">Example:</span>
<span class="nv">\begin</span><span class="nb">{Verbatim}</span>
<span class="nb">enable_dummy</span><span class="o">()</span><span class="nb"> {</span>
<span class="nb">	local device</span><span class="o">=</span><span class="nb">&quot;</span><span class="s">$</span>1&quot;

	config<span class="nb">_</span>get vifs &quot;<span class="s">$</span><span class="nb">device&quot; vifs</span>
<span class="nb">	for vif in </span><span class="s">$</span>vifs; do
		# bring up virtual interface belonging to
		# the wifi-device &quot;<span class="s">$</span><span class="nb">device&quot;</span>
<span class="nb">	done</span>
<span class="nb">}</span>
<span class="nv">\end</span><span class="nb">{Verbatim}</span>

<span class="nv">\subparagraph</span><span class="nb">{</span><span class="nv">\texttt</span><span class="nb">{disable</span><span class="nv">\_</span><span class="nb">&lt;driver&gt;}}</span>

<span class="nb">This function will bring down the wifi device and all its virtual interfaces </span><span class="o">(</span><span class="nb">if supported</span><span class="o">)</span><span class="nb">.</span>

<span class="nb">Example:</span>
<span class="nv">\begin</span><span class="nb">{Verbatim}</span>
<span class="nb">disable_dummy</span><span class="o">()</span><span class="nb"> {</span>
<span class="nb">	local device</span><span class="o">=</span><span class="nb">&quot;</span><span class="s">$</span>1&quot;

	# bring down virtual interfaces belonging to
	# &quot;<span class="s">$</span><span class="nb">device&quot; regardless of whether they are</span>
<span class="nb">	# configured or not. Don&#39;t rely on the vifs</span>
<span class="nb">	# variable at this point</span>
<span class="nb">}</span>
<span class="nv">\end</span><span class="nb">{Verbatim}</span>

<span class="nv">\subparagraph</span><span class="nb">{</span><span class="nv">\texttt</span><span class="nb">{detect</span><span class="nv">\_</span><span class="nb">&lt;driver&gt;}}</span>

<span class="nb">This function looks for interfaces that are usable with the driver. Template config sections</span>
<span class="nb">for new devices should be written to stdout. Must check for already existing config sections</span>
<span class="nb">belonging to the interfaces before creating new templates.</span>

<span class="nb">Example:</span>
<span class="nv">\begin</span><span class="nb">{Verbatim}</span>
<span class="nb">detect_dummy</span><span class="o">()</span><span class="nb"> {</span>
<span class="nb">	</span><span class="o">[</span><span class="nb"> wifi</span><span class="o">-</span><span class="nb">device </span><span class="o">=</span><span class="nb"> &quot;</span><span class="s">$</span>(config<span class="nb">_</span>get dummydev type)&quot; ] <span class="nb">&amp;&amp;</span> return 0
	cat &lt;&lt;EOF
config wifi-device dummydev
	option type dummy
	# REMOVE THIS LINE TO ENABLE WIFI:
	option disabled 1

config wifi-iface
	option device dummydev
	option mode ap
	option ssid OpenWrt
EOF
<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2025-03-30 11:46:50 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
