Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linux DMAのプラットフォーム

Linux DMAのプラットフォーム

  

/* linux /arch /arm /plat-s5p /s3c-pl330.c ** Copyright(C)2010 Samsung Electronics Co. * * Jaswinder Singh< [email protected]> **このプログラムはフリーソフトウェアです。あなたはそれを再配布したり、Free Software Foundationによって発行されたGNU General Public Licenseの条件の下で変更することができます。ライセンスのバージョン2、または*(あなたの選択で)それ以降のバージョン**このプログラムは有用であることを期待して配布されていますが、*無保証です。 *商品性または特定の目的への適合性の暗黙の保証すらありません。詳しくは* GNU一般公衆利用許諾契約書を参照してください。**このプログラムと一緒にGNU一般公衆利用許諾契約書*のコピーを受け取っているはずです。そうでない場合は、米国マサチューセッツ州02139、ケンブリッジ、Mass Ave 675のFree Software * Foundation、Inc.にお書きください。* /

#include< linux /init.h> #include< linux /module .h> #include< linux /interrupt.h> #include< linux /io.h> #include< linux /platform_device.h>

#include< asm /hardware /pl330.h>;

#include< asm /dma.h>

#include< mach /dma.h>

#include< plat /s3c-pl330-pdata .h>

struct s3c_pl330_dmac {struct pl330_info * pi; /*現在ビジー状態のチャネル数* /unsigned busy_chan; /* DMACのグローバルリストに接続する* /struct list_headノード; /* IDのリスト周辺機器のこのDMACは* /enum dma_ch * peri; /* dmac * /struct kmem_cache * kmcache;}のすべてのチャネルにxfersをすばやく割り当てるために* poolを使用できます。

struct s3c_pl330_xfer {/*チャンネル上のxferのリスト* /struct list_headノード; /*このxferの所有者チャンネル* /struct s3c_pl330_chan * chan; /*クライアントから提供されたXfer ID * /void * token;

/* Xfer PL330 cor用e * /struct pl330_xfer px;};

struct s3c_pl330_chan {/*このチャネルと通信できるペリフェラルのID * /enum dma_ch id; /*チャネルのグローバルリストに接続するには* /struct list_head node; /*最後に送信されたPL330コアへのpl330_reqへのポインタ* /struct pl330_req * lrq;

/*キューに入れられたxfersのリストを管理するには* /struct list_head xfer_list; /*常に先頭のxferを指すof /queue * /struct s3c_pl330_xfer * xfer_head;

/*このチャンネルを管理するDMACへのポインタ、*チャンネルが取得可能な場合は* NULL * /struct s3c_pl330_dmac * dmac;

/* PL330 DMACのハードウェアチャネルスレッドのトークン*チャネルが取得可能な場合はNULL * /void * pl330_chan_id;

/* PL330エンジンと通信するための2つの要求* /struct pl330_req req [ ,null,null,3],2];

/*このチャネルのクライアント*チャネルを取得できる場合はNULL * /struct s3c2410_dma_client * client; /*クライアントへのコールバック関数* /s3c2410_dma_cbfn_t callback_fn; /*オプション指定クライアントによる編集* /unsigned intオプション; struct pl330_reqcfg rqcfg; /* s3c2410_dma_devconfig * /unsigned long sdaddrで提供されるアドレス;};

/*プラットフォーム内のすべてのDMAC * /static LIST_HEAD(dmac_list);

/*プラットフォーム内のペリフェラルへの全チャンネル* /static LIST_HEAD(chan_list);

/*グローバルプールにリソース(DMACとChannel)を追加するので、*アクセスを保護する必要があります。グローバルロックを使用してリソースにアクセスする* /static DEFINE_SPINLOCK(res_lock);

/* chan_listのID 'id'を持つチャネルを返す* /static struct s3c_pl330_chan * id_to_chan(const enum dma_ch id){struct s3c_pl330_chan * ch;

list_for_each_entry(ch、& chan_list、node)if(ch-> id == id)return ch;

return NULL;}

/* IDが 'id'の新しいチャンネルを割り当ててchan_listに追加する* /static void chan_add(const enum dma_ch id){struct s3c_pl330_chan * ch = id_to_chan(id);

/*そのチャンネルが既に存在する場合は戻る* /if(ch)return;

ch = kmalloc(sizeof(* ch)、GFP_KERNEL); /*動作するように黙って返す他のチャンネルとの* /if(!ch)return;

ch-> id = id; ch-> dmac = NULL;

list_add_tail(& ch-> node、 & chan_list);}

/*チャンネルがまだどのクライアントにも取得されていない場合* /static bool chan_free(struct s3c_pl330_chan * ch){if(!ch)falseを返す。

/*チャネルはDMACを取得したときのみそのDMACを指します* /return ch-> dmac? false:true;}

/*

Copyright © Windowsの知識 All Rights Reserved