ram_nor.c源碼:
//參考: drivers\mtd\chips\map_ram.c
#include "linux/module.h"
#include "linux/types.h"
#include "linux/kernel.h"
#include "linux/sched.h"
#include "linux/init.h"
#include "asm/io.h"
#include "asm/byteorder.h"
#include "linux/errno.h"
#include "linux/slab.h"
#include "linux/delay.h"
#include "linux/interrupt.h"
#include "linux/reboot.h"
#include "linux/bitmap.h"
#include "linux/mtd/xip.h"
#include "linux/mtd/map.h"
#include "linux/mtd/mtd.h"
#include "linux/mtd/compatmac.h"
#include "linux/mtd/cfi.h"
#define RAM_BLOCK_SIZE (512*1024)
static unsigned char *ramnor_buf;
static struct mtd_info *ram_nor_mtd;
static int ram_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
{
int i;
unsigned char *buf = ramnor_buf + instr->addr;
static int cnt = 0;
printk("%s : %d\n", __FUNCTION__, cnt++);
for (i = 0; i < instr->len; i++)
{
buf[i] = 0xff;
}
instr->state = MTD_ERASE_DONE;
mtd_erase_callback(instr);
return 0;
}
static int ram_nor_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
{
static int cnt = 0;
printk("%s : %d\n", __FUNCTION__, cnt++);
printk("thread: pid = %d, name = %s\n", current->pid, current->comm);
memcpy(buf, ramnor_buf+from, len);
*retlen = len;
return 0;
}
static int ram_nor_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)
{
static int cnt = 0;
printk("%s : %d\n", __FUNCTION__, cnt++);
memcpy(ramnor_buf+to, buf, len);
*retlen = len;
return 0;
}
static void ram_nor_sync_nop(struct mtd_info *mtd)
{
}
static int ram_nor_init(void)
{
ramnor_buf = kmalloc(RAM_BLOCK_SIZE, GFP_KERNEL);
memset(ramnor_buf, 0xff, RAM_BLOCK_SIZE);
// alloc/setup mtd_info
ram_nor_mtd = kzalloc(sizeof(*ram_nor_mtd), GFP_KERNEL);;
ram_nor_mtd->type = MTD_NORFLASH;
// Fill in the default mtd operations
ram_nor_mtd->erase = ram_nor_erase;
ram_nor_mtd->read = ram_nor_read;
ram_nor_mtd->write = ram_nor_write;
ram_nor_mtd->name = "ram_nor";
ram_nor_mtd->size = RAM_BLOCK_SIZE;
ram_nor_mtd->sync = ram_nor_sync_nop;
ram_nor_mtd->flags = MTD_CAP_RAM;
ram_nor_mtd->writesize = 1;
ram_nor_mtd->erasesize = 512;
add_mtd_device(ram_nor_mtd); // add_mtd_partitions
return 0;
}
static void ram_nor_exit(void)
{
del_mtd_device(ram_nor_mtd);
kfree(ram_nor_mtd);
kfree(ramnor_buf);
}
module_init(ram_nor_init);
module_exit(ram_nor_exit);
MODULE_LICENSE("GPL");
=====================================================================
Makefile文件:
all:
make -C /media/sda8/wei/linux-2.6.28_smdk6410 M=`pwd` modules
clean:
make -C /media/sda8/wei/linux-2.6.28_smdk6410 M=`pwd` clean
obj-m += ram_nor.o
=====================================================================
測試詳情可以參考:“JZ2440之NOR FLASH驅動程序”
上一篇:OK6410默認u-boot啟動參數
下一篇:OK6410塊設備驅動之用內存模擬磁盤
推薦閱讀
史海拾趣
ABC Taiwan Electronics Corp成立于上世紀八十年代,起初只是一個小型電子零件加工廠。面對激烈的市場競爭和有限的資源,公司創始人憑借對電子技術的深刻理解和敏銳的市場洞察力,帶領團隊不斷研發新產品,逐步贏得了客戶的信任。通過不斷積累經驗和擴大規模,ABC逐漸在電子零件加工領域站穩了腳跟。
近年來,隨著環保意識的日益增強,ABC Taiwan Electronics Corp積極響應綠色生產的號召。公司引入了環保材料和節能技術,降低了生產過程中的能耗和排放。同時,公司還加強了廢棄物的處理和回收利用,實現了資源的循環利用。此外,ABC還積極參與社會公益活動,支持教育事業和環保事業,履行了企業的社會責任。
這五個故事展示了ABC Taiwan Electronics Corp從創業初期的艱難起步到逐步成長為國際知名電子零件供應商的發展歷程。通過技術突破、國際化戰略、產業升級和綠色生產等方面的努力,ABC不斷應對市場的變化和挑戰,實現了穩健的發展。
隨著公司規模的擴大,CLANDELL公司開始積極履行社會責任。公司不僅關注自身的經濟效益,還積極參與公益事業和環保活動。同時,公司還注重員工的福利待遇和職業發展,為員工提供良好的工作環境和培訓機會。這些舉措不僅提升了CLANDELL公司的社會形象,也為公司的可持續發展注入了新的動力。
這五個故事只是CLANDELL公司發展過程中的一部分,它們展示了公司在電子行業中的崛起之路,也反映了公司不斷追求卓越、勇于創新的精神風貌。
進入安卓時代,HTC再次展現了其敏銳的市場洞察力和強大的技術實力。2008年,HTC聯合電信運營商T-Mobile推出了世界上第一款安卓手機T-Mobile G1,這款手機的成功標志著HTC正式進入了安卓陣營。隨后,HTC推出了多款備受好評的安卓手機,如HTC Hero(G3)等,進一步鞏固了其在智能手機市場的地位。與谷歌和安卓的合作,為HTC帶來了前所未有的發展機遇。
為了進一步拓展市場,勝利公司開始與其他品牌進行跨界合作。例如,公司與知名運動品牌合作推出聯名款羽毛球鞋和服裝,吸引了更多消費者的關注。此外,公司還與電商平臺合作,開展線上銷售業務,為消費者提供更加便捷的購物體驗。
進入21世紀,勝利公司加大了對技術研發的投入,不斷推出具有創新性的產品。例如,公司研發的碳纖維羽毛球拍,不僅輕盈耐用,而且性能卓越,迅速成為市場上的熱銷產品。此外,公司還積極引入新材料、新工藝,不斷提升產品的品質和性能。
使用這些設計技巧和ISE功能分析工具來控制功耗 新一代 FPGA的速度變得越來越快,密度變得越來越高,邏輯資源也越來越多。那么如何才能確保功耗不隨這些一起增加呢?很多設計抉擇可以影響系統的功耗,這些抉擇包括從顯見的器件選擇到細小的基 ...… 查看全部問答∨ |
|
typedef struct { PhysicalAddress bufY; PhysicalAddress bufCb; PhysicalAddress bufCr; } FrameBuffer; static FrameBuffer* pAvailableFrameBuf; static ...… 查看全部問答∨ |
例如有8個signed int相加,因為結果不會大于0xfff但可能大于0xff所以用三個字節來存放計算結果, 現在就有一個麻煩了,三個字節的結果我怎么知道它是正的還是負的?… 查看全部問答∨ |
急求一款好用的CDMA模塊,請大家推薦,真的很急,呵呵...如果您有時間的話請高抬貴手指,推薦推薦!! 該模塊主要是用來做數據傳輸的,做車載的GPS系統,所以要滿足以下要求: 1、內置TCP/IP、PPP協議棧。 2、可以打電話。 3、支持PDU格式的短信 ...… 查看全部問答∨ |
請問STM32初始化告訴晶振判斷穩定后完,I/O,TIM,USART初始化后, 進入應用前時候要不要加入delay? 我測得的現象是這樣的, 上電! _BSP_IntInit(); _RCC_DeInit(); 。。。。。。。。。 。。。。。。。 _RCC_SYSCLKConfig(RCC_SYSCLKS ...… 查看全部問答∨ |