试着对flash写点内容,现在只写入了一个字节,请帮忙看看

[复制链接]
 楼主| adibe 发表于 2008-5-28 08:55 | 显示全部楼层 |阅读模式
SST的flash,main函数中定义了一个字符数组:char&nbsp;txt[]=&quot;This&nbsp;is&nbsp;a&nbsp;example&quot;;然后用此语句&nbsp;&nbsp;Program(0,txt);&nbsp;调用下面的函数。<br /><br />uint8&nbsp;&nbsp;Program(uint16&nbsp;Addr,&nbsp;char&nbsp;*Data)&nbsp;<br />{&nbsp;&nbsp;volatile&nbsp;uint16&nbsp;&nbsp;*ip;<br />&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;temp1,temp2;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(0x5555);<br />&nbsp;&nbsp;&nbsp;ip[0]&nbsp;=&nbsp;0xaaaa;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(0x2aaa);<br />&nbsp;&nbsp;&nbsp;ip[0]&nbsp;=&nbsp;0x5555;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(0x5555);<br />&nbsp;&nbsp;&nbsp;ip[0]&nbsp;=&nbsp;0xa0a0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(Addr);&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;while(Data!='\0')<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ip++&nbsp;=&nbsp;*Data++;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br /><br />现在只能写入第一个字母&nbsp;T&nbsp;,其它的就无法再写入,但是在内存中监视这个addr和Data是有变化的。我现在分析有如下原因:<br />1、现在只对flash的地址0&nbsp;(ip[0])进行了“初始化”,也就只能对这个地址写入,所以其它的均无法写入。<br />2、Program(0,txt);这句话也只是针对了flash的0地址,所以只能写入一个字节。<br />针对这两个疑问,我吧&nbsp;Program(0,txt);&nbsp;中的0地址改用了指针代替,把写入函数改为了:uint8&nbsp;&nbsp;Program(uint16&nbsp;*Addr,&nbsp;char&nbsp;*Data)&nbsp;,出了很多问题。<br />现在把这些问题写出来,也许对你们来说肯定是很简单的问题,我以前基本没接触到嵌入式编程,希望能得到大家的帮助。谢谢。
 楼主| adibe 发表于 2008-5-28 09:09 | 显示全部楼层

这个判断while(Data!='\0')也有问题

见笑了。是个死循环,跳不出来,因为内存里的内容不只有这个数组。<br />我现在关注的是如何将内存里的东西写到flash里,一步一步来吧。
dld2 发表于 2008-5-28 09:38 | 显示全部楼层

FLASH编程

写一次命令序列,只能编程一个word,而不是很多word。
 楼主| adibe 发表于 2008-5-28 09:58 | 显示全部楼层

那如果要连续写入很多数据怎么做呢?

<br />就像我直接用仿真器那样,一次性全部写进去。<br /><br />每次都要编写命令序列?
wujiarui 发表于 2008-5-28 12:10 | 显示全部楼层

把编程命令序列写入循环中

  
来与君 发表于 2008-5-28 18:30 | 显示全部楼层

贴个U-boot的flash.c,但愿没把简单问题搞复杂

/*<br />&nbsp;*&nbsp;(C)&nbsp;Copyright&nbsp;2003-2004<br />&nbsp;*&nbsp;Wolfgang&nbsp;Denk,&nbsp;DENX&nbsp;Software&nbsp;Engineering,&nbsp;wd@denx.de.<br />&nbsp;*<br />&nbsp;*&nbsp;(C)&nbsp;Copyright&nbsp;2004<br />&nbsp;*&nbsp;Martin&nbsp;Krause,&nbsp;TQ-Systems&nbsp;GmbH,&nbsp;martin.krause@tqs.de<br />&nbsp;*<br />&nbsp;*&nbsp;Modified&nbsp;for&nbsp;the&nbsp;CMC&nbsp;PU2&nbsp;by&nbsp;(C)&nbsp;Copyright&nbsp;2004&nbsp;Gary&nbsp;Jennejohn<br />&nbsp;*&nbsp;garyj@denx.de<br />&nbsp;*<br />&nbsp;*&nbsp;See&nbsp;file&nbsp;CREDITS&nbsp;for&nbsp;list&nbsp;of&nbsp;people&nbsp;who&nbsp;contributed&nbsp;to&nbsp;this<br />&nbsp;*&nbsp;project.<br />&nbsp;*<br />&nbsp;*&nbsp;This&nbsp;program&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or<br />&nbsp;*&nbsp;modify&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;as<br />&nbsp;*&nbsp;published&nbsp;by&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation;&nbsp;either&nbsp;version&nbsp;2&nbsp;of<br />&nbsp;*&nbsp;the&nbsp;License,&nbsp;or&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.<br />&nbsp;*<br />&nbsp;*&nbsp;This&nbsp;program&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,<br />&nbsp;*&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of<br />&nbsp;*&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;&nbsp;See&nbsp;the<br />&nbsp;*&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.<br />&nbsp;*<br />&nbsp;*&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License<br />&nbsp;*&nbsp;along&nbsp;with&nbsp;this&nbsp;program;&nbsp;if&nbsp;not,&nbsp;write&nbsp;to&nbsp;the&nbsp;Free&nbsp;Software<br />&nbsp;*&nbsp;Foundation,&nbsp;Inc.,&nbsp;59&nbsp;Temple&nbsp;Place,&nbsp;Suite&nbsp;330,&nbsp;Boston,<br />&nbsp;*&nbsp;MA&nbsp;02111-1307&nbsp;USA<br />&nbsp;*/<br /><br />#include&nbsp;&ltcommon.h&gt<br /><br />#ifndef&nbsp;&nbsp;&nbsp;&nbsp;CFG_ENV_ADDR<br />#define&nbsp;CFG_ENV_ADDR&nbsp;&nbsp;&nbsp;&nbsp;(CFG_FLASH_BASE&nbsp;+&nbsp;CFG_ENV_OFFSET)<br />#endif<br /><br />flash_info_t&nbsp;&nbsp;&nbsp;&nbsp;flash_info[CFG_MAX_FLASH_BANKS];&nbsp;/*&nbsp;info&nbsp;for&nbsp;FLASH&nbsp;chips&nbsp;*/<br /><br />#define&nbsp;FLASH_CYCLE1&nbsp;&nbsp;&nbsp;&nbsp;0x0555<br />#define&nbsp;FLASH_CYCLE2&nbsp;&nbsp;&nbsp;&nbsp;0x02AA<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*&nbsp;Functions<br />&nbsp;*/<br />static&nbsp;ulong&nbsp;flash_get_size(vu_short&nbsp;*addr,&nbsp;flash_info_t&nbsp;*info);<br />static&nbsp;void&nbsp;flash_reset(flash_info_t&nbsp;*info);<br />static&nbsp;int&nbsp;write_word_amd(flash_info_t&nbsp;*info,&nbsp;vu_short&nbsp;*dest,&nbsp;ushort&nbsp;data);<br />static&nbsp;flash_info_t&nbsp;*flash_get_info(ulong&nbsp;base);<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*&nbsp;flash_init()<br />&nbsp;*<br />&nbsp;*&nbsp;sets&nbsp;up&nbsp;flash_info&nbsp;and&nbsp;returns&nbsp;size&nbsp;of&nbsp;FLASH&nbsp;(bytes)<br />&nbsp;*/<br />unsigned&nbsp;long&nbsp;flash_init&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;size&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;ulong&nbsp;flashbase&nbsp;=&nbsp;CFG_FLASH_BASE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Init:&nbsp;no&nbsp;FLASHes&nbsp;known&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(&flash_info[0],&nbsp;0,&nbsp;sizeof(flash_info_t));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;flash_info[0].size&nbsp;=&nbsp;flash_get_size((vu_short&nbsp;*)flashbase,&nbsp;&flash_info[0]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;flash_info[0].size;<br /><br />#if&nbsp;CFG_MONITOR_BASE&nbsp;&gt=&nbsp;CFG_FLASH_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;monitor&nbsp;protection&nbsp;ON&nbsp;by&nbsp;default&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;flash_protect(FLAG_PROTECT_SET,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFG_MONITOR_BASE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFG_MONITOR_BASE+monitor_flash_len-1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash_get_info(CFG_MONITOR_BASE));<br />#endif<br /><br />#ifdef&nbsp;&nbsp;&nbsp;&nbsp;CFG_ENV_IS_IN_FLASH<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;ENV&nbsp;protection&nbsp;ON&nbsp;by&nbsp;default&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;flash_protect(FLAG_PROTECT_SET,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFG_ENV_ADDR,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFG_ENV_ADDR+CFG_ENV_SIZE-1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash_get_info(CFG_ENV_ADDR));<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;size&nbsp;?&nbsp;size&nbsp;:&nbsp;1;<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*/<br />static&nbsp;void&nbsp;flash_reset(flash_info_t&nbsp;*info)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;vu_short&nbsp;*base&nbsp;=&nbsp;(vu_short&nbsp;*)(info-&gtstart[0]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Put&nbsp;FLASH&nbsp;back&nbsp;in&nbsp;read&nbsp;mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((info-&gtflash_id&nbsp;&&nbsp;FLASH_VENDMASK)&nbsp;==&nbsp;FLASH_MAN_INTEL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*base&nbsp;=&nbsp;0x00FF;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Intel&nbsp;Read&nbsp;Mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;((info-&gtflash_id&nbsp;&&nbsp;FLASH_VENDMASK)&nbsp;==&nbsp;FLASH_MAN_AMD)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*base&nbsp;=&nbsp;0x00F0;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;AMD&nbsp;Read&nbsp;Mode&nbsp;*/<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*/<br /><br />static&nbsp;flash_info_t&nbsp;*flash_get_info(ulong&nbsp;base)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;flash_info_t&nbsp;*&nbsp;info;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;CFG_MAX_FLASH_BANKS;&nbsp;i&nbsp;++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;&&nbsp;flash_info;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info-&gtsize&nbsp;&&&nbsp;info-&gtstart[0]&nbsp;&lt=&nbsp;base&nbsp;&&<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;&lt=&nbsp;info-&gtstart[0]&nbsp;+&nbsp;info-&gtsize&nbsp;-&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i&nbsp;==&nbsp;CFG_MAX_FLASH_BANKS&nbsp;?&nbsp;0&nbsp;:&nbsp;info;<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*/<br /><br />void&nbsp;flash_print_info&nbsp;(flash_info_t&nbsp;*info)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info-&gtflash_id&nbsp;==&nbsp;FLASH_UNKNOWN)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;missing&nbsp;or&nbsp;unknown&nbsp;FLASH&nbsp;type\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(info-&gtflash_id&nbsp;&&nbsp;FLASH_VENDMASK)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_MAN_AMD:&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;AMD&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_MAN_BM:&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;BRIGHT&nbsp;MICRO&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_MAN_FUJ:&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;FUJITSU&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_MAN_SST:&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;SST&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_MAN_STM:&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;STM&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_MAN_INTEL:&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;INTEL&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Unknown&nbsp;Vendor&nbsp;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(info-&gtflash_id&nbsp;&&nbsp;FLASH_TYPEMASK)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FLASH_S29GL064M:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;S29GL064M-R6&nbsp;(64Mbit,&nbsp;uniform&nbsp;sector&nbsp;size)\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Unknown&nbsp;Chip&nbsp;Type\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;&nbsp;&nbsp;Size:&nbsp;%ld&nbsp;MB&nbsp;in&nbsp;%d&nbsp;Sectors\n&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsize&nbsp;&gt&gt&nbsp;20,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsector_count);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;&nbsp;&nbsp;Sector&nbsp;Start&nbsp;Addresses:&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&ltinfo-&gtsector_count;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((i&nbsp;%&nbsp;5)&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;\n&nbsp;&nbsp;&nbsp;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;&nbsp;%08lX%s&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtstart,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtprotect&nbsp;?&nbsp;&quot;&nbsp;(RO)&quot;&nbsp;:&nbsp;&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*/<br /><br />/*<br />&nbsp;*&nbsp;The&nbsp;following&nbsp;code&nbsp;cannot&nbsp;be&nbsp;run&nbsp;from&nbsp;FLASH!<br />&nbsp;*/<br /><br />ulong&nbsp;flash_get_size&nbsp;(vu_short&nbsp;*addr,&nbsp;flash_info_t&nbsp;*info)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;ushort&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;ulong&nbsp;base&nbsp;=&nbsp;(ulong)addr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Write&nbsp;auto&nbsp;select&nbsp;command&nbsp;sequence&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE1]&nbsp;=&nbsp;0x00AA;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;for&nbsp;AMD,&nbsp;Intel&nbsp;ignores&nbsp;this&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE2]&nbsp;=&nbsp;0x0055;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;for&nbsp;AMD,&nbsp;Intel&nbsp;ignores&nbsp;this&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE1]&nbsp;=&nbsp;0x0090;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;selects&nbsp;Intel&nbsp;or&nbsp;AMD&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;read&nbsp;Manufacturer&nbsp;ID&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;udelay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;addr[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;Manufacturer&nbsp;ID:&nbsp;%04X\n&quot;,&nbsp;value);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(value)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;(AMD_MANUFACT&nbsp;&&nbsp;0xFFFF):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;Manufacturer:&nbsp;AMD&nbsp;(Spansion)\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;=&nbsp;FLASH_MAN_AMD;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;(INTEL_MANUFACT&nbsp;&&nbsp;0xFFFF):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;Manufacturer:&nbsp;Intel&nbsp;(not&nbsp;supported&nbsp;yet)\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;=&nbsp;FLASH_MAN_INTEL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Unknown&nbsp;Manufacturer&nbsp;ID:&nbsp;%04X\n&quot;,&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;=&nbsp;FLASH_UNKNOWN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsector_count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsize&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;out;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;addr[1];<br />&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;Device&nbsp;ID:&nbsp;%04X\n&quot;,&nbsp;value);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(addr[1])&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;(AMD_ID_MIRROR&nbsp;&&nbsp;0xFFFF):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;Mirror&nbsp;Bit&nbsp;flash:&nbsp;addr[14]&nbsp;=&nbsp;%08X&nbsp;&nbsp;addr[15]&nbsp;=&nbsp;%08X\n&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[14],&nbsp;addr[15]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(addr[14])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;(AMD_ID_GL064M_2&nbsp;&&nbsp;0xFFFF):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(addr[15]&nbsp;!=&nbsp;(AMD_ID_GL064M_3&nbsp;&&nbsp;0xffff))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Chip:&nbsp;S29GLxxxM&nbsp;-&gt&nbsp;unknown\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;=&nbsp;FLASH_UNKNOWN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsector_count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsize&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;Chip:&nbsp;S29GL064M-R6\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;+=&nbsp;FLASH_S29GL064M;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsector_count&nbsp;=&nbsp;128;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsize&nbsp;=&nbsp;0x00800000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;info-&gtsector_count;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtstart&nbsp;=&nbsp;base;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;+=&nbsp;0x10000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;=&gt&nbsp;16&nbsp;MB&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Chip:&nbsp;***&nbsp;unknown&nbsp;***\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;=&nbsp;FLASH_UNKNOWN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsector_count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsize&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Unknown&nbsp;Device&nbsp;ID:&nbsp;%04X\n&quot;,&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id&nbsp;=&nbsp;FLASH_UNKNOWN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsector_count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtsize&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />out:<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Put&nbsp;FLASH&nbsp;back&nbsp;in&nbsp;read&nbsp;mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;flash_reset(info);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(info-&gtsize);<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*/<br /><br />int&nbsp;&nbsp;&nbsp;&nbsp;flash_erase&nbsp;(flash_info_t&nbsp;*info,&nbsp;int&nbsp;s_first,&nbsp;int&nbsp;s_last)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;vu_short&nbsp;*addr&nbsp;=&nbsp;(vu_short&nbsp;*)(info-&gtstart[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;flag,&nbsp;prot,&nbsp;sect,&nbsp;ssect,&nbsp;l_sect;<br />&nbsp;&nbsp;&nbsp;&nbsp;ulong&nbsp;now,&nbsp;last;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;(&quot;flash_erase:&nbsp;first:&nbsp;%d&nbsp;last:&nbsp;%d\n&quot;,&nbsp;s_first,&nbsp;s_last);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((s_first&nbsp;&lt&nbsp;0)&nbsp;||&nbsp;(s_first&nbsp;&gt&nbsp;s_last))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info-&gtflash_id&nbsp;==&nbsp;FLASH_UNKNOWN)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;-&nbsp;missing\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;-&nbsp;no&nbsp;sectors&nbsp;to&nbsp;erase\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((info-&gtflash_id&nbsp;==&nbsp;FLASH_UNKNOWN)&nbsp;||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(info-&gtflash_id&nbsp;&gt&nbsp;FLASH_AMD_COMP))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Can't&nbsp;erase&nbsp;unknown&nbsp;flash&nbsp;type&nbsp;%08lx&nbsp;-&nbsp;aborted\n&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info-&gtflash_id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;prot&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(sect=s_first;&nbsp;sect&lt=s_last;&nbsp;++sect)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info-&gtprotect[sect])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prot++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(prot)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;-&nbsp;Warning:&nbsp;%d&nbsp;protected&nbsp;sectors&nbsp;will&nbsp;not&nbsp;be&nbsp;erased!\n&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prot);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Disable&nbsp;interrupts&nbsp;which&nbsp;might&nbsp;cause&nbsp;a&nbsp;timeout&nbsp;here&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp;disable_interrupts();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Start&nbsp;erase&nbsp;on&nbsp;unprotected&nbsp;sectors.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Since&nbsp;the&nbsp;flash&nbsp;can&nbsp;erase&nbsp;multiple&nbsp;sectors&nbsp;with&nbsp;one&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;we&nbsp;take&nbsp;advantage&nbsp;of&nbsp;that&nbsp;by&nbsp;doing&nbsp;the&nbsp;erase&nbsp;in&nbsp;chunks&nbsp;of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;3&nbsp;sectors.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(sect&nbsp;=&nbsp;s_first;&nbsp;sect&nbsp;&lt=&nbsp;s_last;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_sect&nbsp;=&nbsp;-1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE1]&nbsp;=&nbsp;0x00AA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE2]&nbsp;=&nbsp;0x0055;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE1]&nbsp;=&nbsp;0x0080;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE1]&nbsp;=&nbsp;0x00AA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[FLASH_CYCLE2]&nbsp;=&nbsp;0x0055;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;do&nbsp;the&nbsp;erase&nbsp;in&nbsp;chunks&nbsp;of&nbsp;at&nbsp;most&nbsp;3&nbsp;sectors&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(ssect&nbsp;=&nbsp;0;&nbsp;ssect&nbsp;&lt&nbsp;3;&nbsp;ssect++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((sect&nbsp;+&nbsp;ssect)&nbsp;&gt&nbsp;s_last)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info-&gtprotect[sect&nbsp;+&nbsp;ssect]&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;not&nbsp;protected&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;(vu_short&nbsp;*)(info-&gtstart[sect&nbsp;+&nbsp;ssect]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[0]&nbsp;=&nbsp;0x0030;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_sect&nbsp;=&nbsp;sect&nbsp;+&nbsp;ssect;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;wait&nbsp;at&nbsp;least&nbsp;80us&nbsp;-&nbsp;let's&nbsp;wait&nbsp;1&nbsp;ms&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;udelay&nbsp;(1000);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;We&nbsp;wait&nbsp;for&nbsp;the&nbsp;last&nbsp;triggered&nbsp;sector<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(l_sect&nbsp;&lt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;DONE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reset_timer_masked&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;(vu_short&nbsp;*)(info-&gtstart[l_sect]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((addr[0]&nbsp;&&nbsp;0x0080)&nbsp;!=&nbsp;0x0080)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((now&nbsp;=&nbsp;get_timer_masked&nbsp;())&nbsp;&gt&nbsp;CFG_FLASH_ERASE_TOUT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Timeout\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;show&nbsp;that&nbsp;we're&nbsp;waiting&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((now&nbsp;-&nbsp;last)&nbsp;&gt&nbsp;1000)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;every&nbsp;second&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putc&nbsp;('.');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;now;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;(vu_short&nbsp;*)info-&gtstart[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[0]&nbsp;=&nbsp;0x00F0;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;reset&nbsp;bank&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sect&nbsp;+=&nbsp;ssect;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;re-enable&nbsp;interrupts&nbsp;if&nbsp;necessary&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable_interrupts();<br /><br />DONE:<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;reset&nbsp;to&nbsp;read&nbsp;mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;(vu_short&nbsp;*)info-&gtstart[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[0]&nbsp;=&nbsp;0x00F0;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;reset&nbsp;bank&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;&nbsp;done\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*&nbsp;Copy&nbsp;memory&nbsp;to&nbsp;flash,&nbsp;returns:<br />&nbsp;*&nbsp;0&nbsp;-&nbsp;OK<br />&nbsp;*&nbsp;1&nbsp;-&nbsp;write&nbsp;timeout<br />&nbsp;*&nbsp;2&nbsp;-&nbsp;Flash&nbsp;not&nbsp;erased<br />&nbsp;*/<br /><br />int&nbsp;write_buff&nbsp;(flash_info_t&nbsp;*info,&nbsp;uchar&nbsp;*src,&nbsp;ulong&nbsp;addr,&nbsp;ulong&nbsp;cnt)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ulong&nbsp;wp,&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rc;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(addr&nbsp;&&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;unaligned&nbsp;destination&nbsp;not&nbsp;supported\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ERR_ALIGN;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((int)&nbsp;src&nbsp;&&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;unaligned&nbsp;source&nbsp;not&nbsp;supported\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ERR_ALIGN;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;wp&nbsp;=&nbsp;addr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(cnt&nbsp;&gt=&nbsp;2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;*((vu_short&nbsp;*)src);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((rc&nbsp;=&nbsp;write_word_amd(info,&nbsp;(vu_short&nbsp;*)wp,&nbsp;data))&nbsp;!=&nbsp;0)&nbsp;{<br />printf&nbsp;(&quot;write_buff&nbsp;1:&nbsp;write_word_amd()&nbsp;rc=%d\n&quot;,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;+=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wp&nbsp;+=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;-=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cnt&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(ERR_OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cnt&nbsp;==&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;(*((volatile&nbsp;u8&nbsp;*)&nbsp;src))&nbsp;|&nbsp;(*((volatile&nbsp;u8&nbsp;*)&nbsp;(wp&nbsp;+&nbsp;1))&nbsp;&lt&lt&nbsp;8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((rc&nbsp;=&nbsp;write_word_amd(info,&nbsp;(vu_short&nbsp;*)wp,&nbsp;data))&nbsp;!=&nbsp;0)&nbsp;{<br />printf&nbsp;(&quot;write_buff&nbsp;1:&nbsp;write_word_amd()&nbsp;rc=%d\n&quot;,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;+=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wp&nbsp;+=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;-=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ERR_OK;<br />}<br /><br />/*-----------------------------------------------------------------------<br />&nbsp;*&nbsp;Write&nbsp;a&nbsp;word&nbsp;to&nbsp;Flash&nbsp;for&nbsp;AMD&nbsp;FLASH<br />&nbsp;*&nbsp;A&nbsp;word&nbsp;is&nbsp;16&nbsp;or&nbsp;32&nbsp;bits,&nbsp;whichever&nbsp;the&nbsp;bus&nbsp;width&nbsp;of&nbsp;the&nbsp;flash&nbsp;bank<br />&nbsp;*&nbsp;(not&nbsp;an&nbsp;individual&nbsp;chip)&nbsp;is.<br />&nbsp;*<br />&nbsp;*&nbsp;returns:<br />&nbsp;*&nbsp;0&nbsp;-&nbsp;OK<br />&nbsp;*&nbsp;1&nbsp;-&nbsp;write&nbsp;timeout<br />&nbsp;*&nbsp;2&nbsp;-&nbsp;Flash&nbsp;not&nbsp;erased<br />&nbsp;*/<br />static&nbsp;int&nbsp;write_word_amd&nbsp;(flash_info_t&nbsp;*info,&nbsp;vu_short&nbsp;*dest,&nbsp;ushort&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;flag;<br />&nbsp;&nbsp;&nbsp;&nbsp;vu_short&nbsp;*base;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;first&nbsp;address&nbsp;in&nbsp;flash&nbsp;bank&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Check&nbsp;if&nbsp;Flash&nbsp;is&nbsp;(sufficiently)&nbsp;erased&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((*dest&nbsp;&&nbsp;data)&nbsp;!=&nbsp;data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;=&nbsp;(vu_short&nbsp;*)(info-&gtstart[0]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Disable&nbsp;interrupts&nbsp;which&nbsp;might&nbsp;cause&nbsp;a&nbsp;timeout&nbsp;here&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp;disable_interrupts();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;base[FLASH_CYCLE1]&nbsp;=&nbsp;0x00AA;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;unlock&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;base[FLASH_CYCLE2]&nbsp;=&nbsp;0x0055;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;unlock&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;base[FLASH_CYCLE1]&nbsp;=&nbsp;0x00A0;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;selects&nbsp;program&nbsp;mode&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*dest&nbsp;=&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;start&nbsp;programming&nbsp;the&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;re-enable&nbsp;interrupts&nbsp;if&nbsp;necessary&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable_interrupts();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;reset_timer_masked&nbsp;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;data&nbsp;polling&nbsp;for&nbsp;D7&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((*dest&nbsp;&&nbsp;0x0080)&nbsp;!=&nbsp;(data&nbsp;&&nbsp;0x0080))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(get_timer_masked&nbsp;()&nbsp;&gt&nbsp;CFG_FLASH_WRITE_TOUT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*dest&nbsp;=&nbsp;0x00F0;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;reset&nbsp;bank&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(0);<br />}
 楼主| adibe 发表于 2008-5-28 18:49 | 显示全部楼层

谢谢楼上大哥

现在改了下可以了<br /><br />while(*Data!='\0')&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(0x5555);&nbsp;<br />&nbsp;&nbsp;*ip&nbsp;=&nbsp;0xaaaa;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(0x2aaa);&nbsp;<br />&nbsp;&nbsp;*ip&nbsp;=&nbsp;0x5555;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(0x5555);&nbsp;<br />&nbsp;&nbsp;*ip&nbsp;=&nbsp;0xa0a0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;ip&nbsp;=&nbsp;GetAddr(Addr);&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;*ip++&nbsp;=&nbsp;*Data++;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br />果然是那个问题,ip【0】只有第一个地址的时序,现在改为*ip后可以对后面的地址做时序,所以现在可以写进去东西了。&nbsp;while判断也已经ok,现在的问题是:我定义的数组是:static&nbsp;char&nbsp;&nbsp;txt[]=&quot;This&nbsp;is&nbsp;an&nbsp;example&quot;;&nbsp;8位的,可是现在cpu都是按字16位操作的,所以搞8位全写0,低8位才是数组数据,这个矛盾怎么解决?&nbsp;现在写入flash的内容都是有一个字节的空格的:T_h_i_s&nbsp;……&nbsp;<br />
来与君 发表于 2008-5-28 20:08 | 显示全部楼层

还是看上面那个U-Boot的例子吧

每次写一个int的话,指针加2,最后在小于等于2个字节时再另外处理。
 楼主| adibe 发表于 2008-5-29 15:11 | 显示全部楼层

为什么加了一个printf函数后程序不能运行

在写完一个数组后,我加了个printf函数。<br />AXD里应该有输出终端可以显示打印的窗口吧?<br /><br />现在加了这句后程序无法运行,停在软件中断那里,程序无法载入内存里。注释掉这句话就可以了,这是为什么?
 楼主| adibe 发表于 2008-5-30 09:24 | 显示全部楼层

已经搞定

按上面的思路:把调用函数的data改为了16位的,uint8&nbsp;&nbsp;Program(uint16&nbsp;Addr,&nbsp;uint16&nbsp;*Data)&nbsp;,使之和地址位数对齐,这样让字符串的指针也一次加一个字,在函数调用时做个类型转换,对应就没问题了。&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

275

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部