Mercurial > pt1
diff driver/pt1_pci.c @ 142:1e7718cc2556
use utf-8 instead of euc-jp
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Wed, 30 Apr 2014 11:26:24 +0900 |
parents | 45b4afa656d2 |
children | d56831676696 |
line wrap: on
line diff
--- a/driver/pt1_pci.c Tue Oct 01 16:36:12 2013 +0900 +++ b/driver/pt1_pci.c Wed Apr 30 11:26:24 2014 +0900 @@ -80,18 +80,18 @@ MODULE_DEVICE_TABLE(pci, pt1_pci_tbl); #define DEV_NAME "pt1video" -#define PACKET_SIZE 188 // 1パケット長 -#define MAX_READ_BLOCK 4 // 1度に読み出す最大DMAバッファ数 -#define MAX_PCI_DEVICE 128 // 最大64枚 -#define DMA_SIZE 4096 // DMAバッファサイズ +#define PACKET_SIZE 188 // 1宴 +#define MAX_READ_BLOCK 4 // 1綺茯水冴紊DMA≧ +#define MAX_PCI_DEVICE 128 // 紊64 +#define DMA_SIZE 4096 // DMA<泣ゃ #define DMA_RING_SIZE 128 // number of DMA RINGS -#define DMA_RING_MAX 511 // number of DMA entries in a RING(1023はNGで511まで) -#define CHANNEL_DMA_SIZE (2*1024*1024) // 地デジ用(16Mbps) -#define BS_CHANNEL_DMA_SIZE (4*1024*1024) // BS用(32Mbps) +#define DMA_RING_MAX 511 // number of DMA entries in a RING(1023NG511障) +#define CHANNEL_DMA_SIZE (2*1024*1024) // 違悟(16Mbps) +#define BS_CHANNEL_DMA_SIZE (4*1024*1024) // BS(32Mbps) #define READ_SIZE (16*DMA_SIZE) typedef struct _DMA_CONTROL{ - dma_addr_t ring_dma[DMA_RING_MAX] ; // DMA情報 + dma_addr_t ring_dma[DMA_RING_MAX] ; // DMA __u32 *data[DMA_RING_MAX]; }DMA_CONTROL; @@ -102,7 +102,7 @@ __u32 mmio_len ; void __iomem *regs; struct mutex lock ; - dma_addr_t ring_dma[DMA_RING_SIZE] ; // DMA情報 + dma_addr_t ring_dma[DMA_RING_SIZE] ; // DMA void *dmaptr[DMA_RING_SIZE] ; struct task_struct *kthread; dev_t dev ; @@ -121,29 +121,29 @@ }MICRO_PACKET; struct _PT1_CHANNEL{ - __u32 valid ; // 使用中フラグ - __u32 address ; // I2Cアドレス - __u32 channel ; // チャネル番号 - int type ; // チャネルタイプ - __u32 packet_size ; // パケットサイズ - __u32 drop ; // パケットドロップ数 - struct mutex lock ; // CH別mutex_lock用 - __u32 size ; // DMAされたサイズ - __u32 maxsize ; // DMA用バッファサイズ - __u32 bufsize ; // チャネルに割り振られたサイズ - __u32 overflow ; // オーバーフローエラー発生 - __u32 counetererr ; // 転送カウンタ1エラー - __u32 transerr ; // 転送エラー - __u32 minor ; // マイナー番号 - __u8 *buf; // CH別受信メモリ + __u32 valid ; // 篏睡筝 + __u32 address ; // I2C≪ + __u32 channel ; // c + int type ; // c帥ゃ + __u32 packet_size ; // 宴泣ゃ + __u32 drop ; // 宴 + struct mutex lock ; // CHmutex_lock + __u32 size ; // DMA泣ゃ + __u32 maxsize ; // DMA<泣ゃ + __u32 bufsize ; // c蚊泣ゃ + __u32 overflow ; // 若若若主榊 + __u32 counetererr ; // 荵∫潟随 + __u32 transerr ; // 荵∫ + __u32 minor ; // ゃ主 + __u8 *buf; // CHュ篆<<≪ __u32 pointer; - __u8 req_dma ; // 溢れたチャネル - __u8 packet_buf[PACKET_SIZE] ; // 溢れたチャネル - PT1_DEVICE *ptr ; // カード別情報 + __u8 req_dma ; // 羣≪c + __u8 packet_buf[PACKET_SIZE] ; // 羣≪c + PT1_DEVICE *ptr ; // 若ユ wait_queue_head_t wait_q ; // for poll on reading }; -// I2Cアドレス(video0, 1 = ISDB-S) (video2, 3 = ISDB-T) +// I2C≪(video0, 1 = ISDB-S) (video2, 3 = ISDB-T) int i2c_address[MAX_CHANNEL] = {T0_ISDB_S, T1_ISDB_S, T0_ISDB_T, T1_ISDB_T}; int real_channel[MAX_CHANNEL] = {0, 2, 1, 3}; int channeltype[MAX_CHANNEL] = {CHANNEL_TYPE_ISDB_S, CHANNEL_TYPE_ISDB_S, @@ -164,25 +164,25 @@ int data_pos = 0 ; __u32 *dataptr ; - // データ初期化 + // 若水 for(ring_pos = 0 ; ring_pos < DMA_RING_SIZE ; ring_pos++){ for(data_pos = 0 ; data_pos < DMA_RING_MAX ; data_pos++){ dataptr = (dev_conf->dmactl[ring_pos])->data[data_pos]; dataptr[(DMA_SIZE / sizeof(__u32)) - 2] = 0; } } - // 転送カウンタをリセット + // 荵∫潟帥祉 writel(0x00000010, dev_conf->regs); - // 転送カウンタをインクリメント + // 荵∫潟帥ゃ潟<潟 for(lp = 0 ; lp < DMA_RING_SIZE ; lp++){ writel(0x00000020, dev_conf->regs); } addr = (int)dev_conf->ring_dma[0] ; addr >>= 12 ; - // DMAバッファ設定 + // DMA∴┃絎 writel(addr, dev_conf->regs + DMA_ADDR); - // DMA開始 + // DMA紮 writel(0x0c000040, dev_conf->regs); } @@ -215,7 +215,7 @@ for(;;){ dataptr = (dev_conf->dmactl[ring_pos])->data[data_pos]; - // データあり? + // 若帥鐚 if(dataptr[(DMA_SIZE / sizeof(__u32)) - 2] == 0){ break ; } @@ -225,7 +225,7 @@ for(lp = 0 ; lp < (DMA_SIZE / sizeof(__u32)) ; lp++, dataptr++){ micro.val = *dataptr ; dma_channel = ((micro.packet.head >> 5) & 0x07); - //チャネル情報不正 + //c延罩 if(dma_channel > MAX_CHANNEL){ printk(KERN_ERR "DMA Channel Number Error(%d)\n", dma_channel); continue ; @@ -233,7 +233,7 @@ chno = real_channel[(((micro.packet.head >> 5) & 0x07) - 1)]; packet_pos = ((micro.packet.head >> 2) & 0x07); channel = dev_conf->channel[chno] ; - // エラーチェック + // 若с if((micro.packet.head & MICROPACKET_ERROR)){ val = readl(dev_conf->regs); if((val & BIT_RAM_OVERFLOW)){ @@ -245,24 +245,24 @@ if((val & BIT_INITIATOR_WARNING)){ channel->transerr += 1 ; } - // 初期化して先頭から + // reset_dma(dev_conf); ring_pos = data_pos = 0 ; break ; } - // 未使用チャネルは捨てる + // 篏睡c if(channel->valid == FALSE){ continue ; } mutex_lock(&channel->lock); - // あふれたら読み出すまで待つ + // 泣茯水冴障у while(1){ if(channel->size >= (channel->maxsize - PACKET_SIZE - 4)){ - // 該当チャンネルのDMA読みだし待ちにする + // 荅峨c潟DMA茯帥緇< wake_up(&channel->wait_q); channel->req_dma = TRUE ; mutex_unlock(&channel->lock); - // タスクに時間を渡す為中断 + // 帥鴻羝<坂賢 wait_event_timeout(dev_conf->dma_wait_q, (channel->req_dma == FALSE), msecs_to_jiffies(500)); mutex_lock(&channel->lock); @@ -271,32 +271,32 @@ break ; } } - // 先頭で、一時バッファに残っている場合 + // с筝<罧c翫 if((micro.packet.head & 0x02) && (channel->packet_size != 0)){ channel->packet_size = 0 ; } - // データコピー + // 若帥潟 channel->packet_buf[channel->packet_size] = micro.packet.data[2]; channel->packet_buf[channel->packet_size+1] = micro.packet.data[1]; channel->packet_buf[channel->packet_size+2] = micro.packet.data[0]; channel->packet_size += 3; - // パケットが出来たらコピーする + // 宴堺ャ潟若 if(channel->packet_size >= PACKET_SIZE){ if (channel->pointer + channel->size >= channel->maxsize) { - // リングバッファの境界を越えていてリングバッファの先頭に戻っている場合 - // channel->pointer + channel->size - channel->maxsize でリングバッファ先頭からのアドレスになる + // 潟違<紜莇潟違<祉c翫 + // channel->pointer + channel->size - channel->maxsize с潟違≦≪鴻 memcpy(&channel->buf[channel->pointer + channel->size - channel->maxsize], channel->packet_buf, PACKET_SIZE); } else if (channel->pointer + channel->size + PACKET_SIZE > channel->maxsize) { - // リングバッファの境界をまたぐように書き込まれる場合 - // リングバッファの境界まで書き込み + // 潟違<紜障吾莨若障翫 + // 潟違<紜障ф吾莨若 __u32 tmp_size = channel->maxsize - (channel->pointer + channel->size); memcpy(&channel->buf[channel->pointer + channel->size], channel->packet_buf, tmp_size); - // 先頭に戻って書き込み + // 祉c吾莨若 memcpy(channel->buf, &channel->packet_buf[tmp_size], PACKET_SIZE - tmp_size); } else { - // リングバッファ内で収まる場合 - // 通常の書き込み + // 潟違≦у障翫 + // 絽吾吾莨若 memcpy(&channel->buf[channel->pointer + channel->size], channel->packet_buf, PACKET_SIZE); } channel->size += PACKET_SIZE ; @@ -309,14 +309,14 @@ if(data_pos >= DMA_RING_MAX){ data_pos = 0; ring_pos += 1 ; - // DMAリングが変わった場合はインクリメント + // DMA潟違紊c翫ゃ潟<潟 writel(0x00000020, dev_conf->regs); if(ring_pos >= DMA_RING_SIZE){ ring_pos = 0 ; } } - // 頻度を落す(wait until READ_SIZE) + // 糸墾純(wait until READ_SIZE) for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ channel = dev_conf->channel[real_channel[lp]] ; if((channel->size >= READ_SIZE) && (channel->valid == TRUE)){ @@ -368,7 +368,7 @@ channel->packet_size = 0 ; file->private_data = channel; mutex_lock(&channel->lock); - // データ初期化 + // 若水 channel->size = 0 ; mutex_unlock(&channel->lock); mutex_unlock(&device[lp]->lock); @@ -392,7 +392,7 @@ channel->counetererr = 0 ; channel->transerr = 0 ; channel->drop = 0 ; - // 停止している場合は起こす + // 罩≪翫莎激 if(channel->req_dma == TRUE){ channel->req_dma = FALSE ; wake_up(&channel->ptr->dma_wait_q); @@ -413,7 +413,7 @@ __u32 size ; unsigned long dummy; - // READ_SIZE単位で起こされるのを待つ(CPU負荷対策) + // READ_SIZE篏ц儀緇(CPU莢桁丞) if(channel->size < READ_SIZE){ wait_event_timeout(channel->wait_q, (channel->size >= READ_SIZE), msecs_to_jiffies(500)); @@ -424,28 +424,28 @@ }else{ __u32 tmp_size = 0; if (cnt < channel->size) { - // バッファにあるデータより小さい読み込みの場合 + // <若帥絨茯粋昭帥翫 size = cnt; } else { - // バッファにあるデータ以上の読み込みの場合 + // <若推札筝茯粋昭帥翫 size = channel->size; } if (channel->maxsize <= size + channel->pointer) { - // リングバッファの境界を越える場合 + // 潟違<紜莇翫 tmp_size = channel->maxsize - channel->pointer; - // 境界までコピー + // 紜障с潟 dummy = copy_to_user(buf, &channel->buf[channel->pointer], tmp_size); - // 残りをコピー + // 罧潟 dummy = copy_to_user(&buf[tmp_size], channel->buf, size - tmp_size); channel->pointer = size - tmp_size; } else { - // 普通にコピー + // 潟 dummy = copy_to_user(buf, &channel->buf[channel->pointer], size); channel->pointer += size; } channel->size -= size; } - // 読み終わったかつ使用しているのがが4K以下 + // 茯睡cや戎4K篁ヤ if(channel->req_dma == TRUE){ channel->req_dma = FALSE ; wake_up(&channel->ptr->dma_wait_q); @@ -634,7 +634,7 @@ __u32 addr ; __u32 *ptr ; - //DMAリング作成 + //DMA潟遺 for(lp = 0 ; lp < DMA_RING_SIZE ; lp++){ ptr = dev_conf->dmaptr[lp]; if(lp == (DMA_RING_SIZE - 1)){ @@ -654,7 +654,7 @@ return -1 ; } dmactl->data[lp2] = dmaptr ; - // DMAデータエリア初期化 + // DMA若帥√ dmaptr[(DMA_SIZE / sizeof(__u32)) - 2] = 0 ; addr = (__u32)dmactl->ring_dma[lp2]; addr >>= 12 ; @@ -763,7 +763,7 @@ break; } - // PCIアドレスをマップする + // PCI≪鴻 dev_conf->mmio_start = pci_resource_start(pdev, 0); dev_conf->mmio_len = pci_resource_len(pdev, 0); dummy = request_mem_region(dev_conf->mmio_start, dev_conf->mmio_len, DEV_NAME); @@ -777,12 +777,12 @@ printk(KERN_ERR "pt1:Can't remap register area.\n"); goto out_err_regbase; } - // 初期化処理 + // if(xc3s_init(dev_conf->regs, dev_conf->cardtype)){ printk(KERN_ERR "Error xc3s_init\n"); goto out_err_fpga; } - // チューナリセット + // ャ若祉 settuner_reset(dev_conf->regs, dev_conf->cardtype, LNB_OFF, TUNER_POWER_ON_RESET_ENABLE); schedule_timeout_interruptible(msecs_to_jiffies(100)); @@ -790,7 +790,7 @@ schedule_timeout_interruptible(msecs_to_jiffies(100)); mutex_init(&dev_conf->lock); - // Tuner 初期化処理 + // Tuner for(lp = 0 ; lp < MAX_TUNER ; lp++){ rc = tuner_init(dev_conf->regs, dev_conf->cardtype, &dev_conf->lock, lp); if(rc < 0){ @@ -798,7 +798,7 @@ goto out_err_fpga; } } - // 初期化完了 + // 絎篋 for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ set_sleepmode(dev_conf->regs, &dev_conf->lock, i2c_address[lp], channeltype[lp], TYPE_SLEEP); @@ -810,7 +810,7 @@ goto out_err_fpga; } - // 初期化 + // init_waitqueue_head(&dev_conf->dma_wait_q); minor = MINOR(dev_conf->dev) ; @@ -834,16 +834,16 @@ return -ENOMEM ; } - // 共通情報 + // 演 mutex_init(&channel->lock); - // 待ち状態を解除 + // 緇∞倶茹i channel->req_dma = FALSE ; - // マイナー番号設定 + // ゃ主埈┃絎 channel->minor = MINOR(dev_conf->dev) + lp ; - // 対象のI2Cデバイス + // 絲乗院I2Cゃ channel->address = i2c_address[lp] ; channel->type = channeltype[lp] ; - // 実際のチューナ番号 + // 絎ャ若 channel->channel = real_channel[lp] ; channel->ptr = dev_conf ; channel->size = 0 ; @@ -941,7 +941,7 @@ dev_conf->kthread = NULL; } - // DMA終了 + // DMA腟篋 writel(0x08080000, dev_conf->regs); for(lp = 0 ; lp < 10 ; lp++){ val = readl(dev_conf->regs);