日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QCC300x笔记(5) -- 外部Flash的读写操作

發(fā)布時(shí)間:2023/12/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QCC300x笔记(5) -- 外部Flash的读写操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

哈嘍大家好,這是該系列博文的第五篇~ 篇~


<<【系列博文索引】快速通道 >

1.?? ?QCC300X 外部Flash的讀寫
?? ??? ?QCC300x是使用外部Flash片子,使用外部flash的好處就是成本下來了,大家都知道,CSR的片子一直是很貴的,這樣的片子就只能對(duì)成本要求不高的項(xiàng)目優(yōu)先,在使用外部Flash時(shí),我們一般默認(rèn)使用32M(因?yàn)楣俜脚渲镁褪沁@個(gè)參數(shù),會(huì)讓使用方便的多),然而我們?cè)谑褂眠^程往往使用不了這么大的空間,現(xiàn)在我們就利用起來,一起來學(xué)習(xí)對(duì)外部Flash的應(yīng)用。

?? ??? ?1.1.?? ?為外部flash分區(qū)
?? ??? ??? ?要對(duì)外部Flash使用,必先是對(duì)外部Flash進(jìn)行分區(qū),上一節(jié)做Upgrade時(shí)有對(duì)分區(qū)文件說明,即XXX.ptn文件。
? ? ? ? ? 需要注意的是外部的Flash可以作為兩種用途使用,一種是只讀的文件系統(tǒng),另一種是未處理的連續(xù)數(shù)據(jù)分區(qū)(Raw Serial),只讀的文件系統(tǒng)是對(duì)于代碼,語音文件,用戶文件等保存于Flash中,但是這個(gè)需要以文件的形式打包寫入,在代碼中不可以被修改,僅僅可以讀取。
?? ??? ?未處理的連續(xù)數(shù)據(jù)分區(qū),就是純粹的Flash數(shù)據(jù),在程序中可以寫入和讀取。

?? ??? ?使用文件系統(tǒng)時(shí)我們需要掛載分區(qū),使用Raw Serial分區(qū)時(shí) 不需要掛載分區(qū)。

?? ??? ?我們想實(shí)現(xiàn)一個(gè)在Flash中的數(shù)據(jù)寫入和讀取,所以Flash在原來的分區(qū)下添加一個(gè)Raw Serial分區(qū):

?? ??? ?0, 8K, PS, (none) # For PS Store
?? ??? ?1, 32K, RO, i1107e_patch_bundle.xuv # Logical #0 : For DSP & firmware patches #0,1
?? ??? ?2, 32K, RO, (erase) # Logical #0 : For DSP & firmware patches #0,2
?? ??? ?3, 612K, RO, (erase) # Logical #1 Audio prompts #1,1
?? ??? ?4, 612K, RO, (erase) # Logical #1 Audio prompts #1,2
?? ??? ?5, 300K, RO, i1107e.xuv # Logical #2 Main application image and other files. #2,1
?? ??? ?6, 300K, RO, (erase) # Logical #2 Main application image and other files. #2,2
?? ??? ?7, 8K, RO, system_i1107e.xuv # Logical #3 PSFS ?#3,1
?? ??? ?8, 8K, RO, (erase) # Logical #3 PSFS #3,2
?? ??? ?9, 8K, RS, (erase)?
?? ??? ?10, 8K, RS, (erase)?
?? ??? ?11, *, RS, (erase)
?? ??? ?即添加分區(qū)9和10,大小為8K,分區(qū)類型是RS(Raw Serial),(erase)每次下載重新擦除。

?? ??? ?需要說明一下,這個(gè)分區(qū)文件涉及下載軟件Xide.exe的下載流程,新添加的分區(qū)盡量填寫每次下載擦除,否則會(huì)影響下載,
?? ??? ?我之前有調(diào)試過使用(none)會(huì)導(dǎo)致下載有很久的卡頓,導(dǎo)致下載時(shí)間超長。

?? ??? ?1.2.?? ?Flash寫入數(shù)據(jù)
?? ??? ?Flash在分好區(qū)后就可以讀寫了,Flash的讀寫也是一個(gè)流的概論,寫入需要獲取一個(gè)Sink,讀取需要獲取一個(gè)Source ,需要注意的是Flash在沒有數(shù)據(jù)時(shí)是讀取不到數(shù)據(jù)的,直接讀取未寫入數(shù)據(jù)的Flash會(huì)是空。

?? ??? ?1.2.1.?? ?獲取Flash的Sink
?? ??? ?獲取Sink的方法,ADK提供了兩個(gè)函數(shù),可以獲取Flash的Sink,分別是
?? ??? ?Sink StreamPartitionOverwriteSink(partition_filesystem_devices device,
?? ??? ?uint16 partition)?
?? ??? ?Sink StreamPartitionResumeSink(partition_filesystem_devices device,
?? ??? ?uint16 partition,uint16 first_word);?

?? ??? ?可以在Partition 和Stream的代碼文件中找到。

?? ??? ?第一個(gè)函數(shù)重新寫入Flash,獲取的Sink寫入后會(huì)覆蓋之前寫入的數(shù)據(jù)。

?? ??? ?第二個(gè)函數(shù)是再次寫入Flash。第三個(gè)參數(shù)是需要寫入的起始地址,如果Sink中已經(jīng)存在數(shù)據(jù),可以使用
?? ??? ?uint32 PartitionSinkPosition(Sink sink)函數(shù)來獲取已經(jīng)存在的Flash數(shù)據(jù)大小

?? ??? ?partition_filesystem_devices :是選擇分區(qū)文件的類型,我們需要選擇Flash
?? ??? ?Partition:這個(gè)參數(shù)就是我們分區(qū)時(shí)分的分區(qū)號(hào),就是XXX.ptn文件中添加的9或10分區(qū)號(hào)。

?? ??? ?1.2.2.?? ?設(shè)置Flash的寫入配置
?? ??? ?Flash在寫入是需要設(shè)置其寫入配置,配置需要如下函數(shù)設(shè)置:
?? ??? ?bool PartitionSetMessageDigest(Sink sink, partition_message_digest_type md_ty, uint16 *data, uint16 len)?
?? ??? ?這個(gè)函數(shù)可以設(shè)置Flash的配置,
?? ??? ?sink: The sink that is writing to the partition
?? ??? ?md_type: The type of message digest:
?? ??? ??? ?PARTITION_MESSAGE_DIGEST_APP_SIGNATURE: Signed with the application DFU key (see note)
?? ??? ??? ?PARTITION_MESSAGE_DIGEST_CRC: Filesystem CRC
?? ??? ??? ?PARTITION_MESSAGE_DIGEST_SKIP: Do not perform verification
?? ??? ?data: pointer to the message digest
?? ??? ?len: length of message digest. 2 for CRC verification, 66 for signature verification?

?? ??? ?1.2.3.?? ?獲取Flash的狀態(tài)
?? ??? ?這一步不是必要的,我們?cè)诓僮鱂lash,如果需要查看看狀態(tài)可使用:
?? ??? ?bool PartitionGetInfo(partition_filesystem_devices device, uint16 partition,partition_info_key key, uint32 *value)?

?? ??? ?參數(shù)說明:
?? ??? ?device: The device to query. Set to PARTITION_SERIAL_FLASH to query the serial flash device.
?? ??? ?partition: The number of the partition to query.
?? ??? ?key: The type of information requested:
?? ??? ??? ?PARTITION_INFO_IS_MOUNTED: Whether a partition is mounted or not (1 = mounted, 0 = unmounted).
?? ??? ??? ?PARTITION_INFO_SIZE: The size of the partition in words.
?? ??? ??? ?PARTITION_INFO_TYPE: The type of the partition (0 = unused, 1 = filesystem, 2 = PS Store).
?? ??? ?value: The pointer to return the query result to?

?? ??? ?1.2.4.?? ?寫入Flash數(shù)據(jù)
?? ??? ?寫入數(shù)據(jù)是最后的一步,但是沒有前面的鋪墊,是不能寫入成功的,我們得到的分區(qū)Sink,就是我們寫入數(shù)據(jù)入口。

?? ??? ?拿到Sink后,我們不能盲目寫入,可以使用SinkSlack(Sink sink),查看一下Sink可以寫入的最大數(shù)據(jù)量,我測(cè)試過程中獲取到的是48,說明Flash每次最大只能寫入48個(gè)字符,如果我們需要大量寫入,可以分批寫入數(shù)據(jù)。

?? ??? ?數(shù)據(jù)寫入:
?? ??? ?第一步:使用SinkMap(Sink sink) 獲取一個(gè)指針;SinkClaim(Sink sink ,uint16 extra) 聲明一下寫入的大小,為了檢查能否寫入,如果返回0xFFFF,說明不能寫入。

?? ??? ?第二步:使用memcpy() 把需要寫入的數(shù)據(jù)搬運(yùn)到SinkMap()指針指向的地址上,

?? ??? ?第三步:使用SinkFlush(Sink sink uint6 amount)實(shí)現(xiàn)Flash的真正寫入。

?? ??? ?第四步:使用SinkClose(Sink sink)關(guān)閉Sink
?? ??? ?需要注意的是:
?? ??? ?1,Sink寫入數(shù)據(jù)后,如果需要讀取,必先使用第四步關(guān)閉Sink才能讀取,但是使用SinkClose()關(guān)閉Sink后,不能再次對(duì)Flash寫入,需要使用重啟寫入函數(shù)對(duì)Flash重啟寫入。
?? ??? ?2,如果需要多次分批寫入Flash,不要SinkClose()關(guān)閉Sink,完全寫入完成后,再關(guān)閉Sink,關(guān)閉后,再次寫入Flash失效,需要重新覆蓋寫入,

?? ??? ?3,Sink再次寫入時(shí),需要重新獲取Sink,獲取的Sink偏移需要PartitionSinkGetPosition函數(shù)獲取即可。

?? ??? ?如果上面的步驟沒有出錯(cuò),恭喜你,你的Flash數(shù)據(jù)寫入成功。

?? ??? ?1.2.5.?? ?Flash寫入程序附錄
?? ??? ?示例代碼只是初步演示:

?? ??? ?Flash的寫入:?? ??? ?

完整代碼請(qǐng)聯(lián)系版主? ? ? ? ? ? ? ?‘

總結(jié)

以上是生活随笔為你收集整理的QCC300x笔记(5) -- 外部Flash的读写操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。