⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saa6752hs.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
static void saa6752hs_set_params(struct i2c_client* client,				 struct v4l2_mpeg_compression* params){	struct saa6752hs_state *h = i2c_get_clientdata(client);	/* check PIDs */	if (params->ts_pid_pmt <= MPEG_PID_MAX)		h->params.ts_pid_pmt = params->ts_pid_pmt;	if (params->ts_pid_pcr <= MPEG_PID_MAX)		h->params.ts_pid_pcr = params->ts_pid_pcr;	if (params->ts_pid_video <= MPEG_PID_MAX)		h->params.ts_pid_video = params->ts_pid_video;	if (params->ts_pid_audio <= MPEG_PID_MAX)		h->params.ts_pid_audio = params->ts_pid_audio;	/* check bitrate parameters */	if ((params->vi_bitrate.mode == V4L2_BITRATE_CBR) ||	    (params->vi_bitrate.mode == V4L2_BITRATE_VBR))		h->params.vi_bitrate.mode = params->vi_bitrate.mode;	if (params->vi_bitrate.mode != V4L2_BITRATE_NONE)		h->params.st_bitrate.target = params->st_bitrate.target;	if (params->vi_bitrate.mode != V4L2_BITRATE_NONE)		h->params.vi_bitrate.target = params->vi_bitrate.target;	if (params->vi_bitrate.mode == V4L2_BITRATE_VBR)		h->params.vi_bitrate.max = params->vi_bitrate.max;	if (params->au_bitrate.mode != V4L2_BITRATE_NONE)		h->params.au_bitrate.target = params->au_bitrate.target;	/* aspect ratio */	if (params->vi_aspect_ratio == V4L2_MPEG_ASPECT_4_3 ||	    params->vi_aspect_ratio == V4L2_MPEG_ASPECT_16_9)		h->params.vi_aspect_ratio = params->vi_aspect_ratio;	/* range checks */	if (h->params.st_bitrate.target > MPEG_TOTAL_TARGET_BITRATE_MAX)		h->params.st_bitrate.target = MPEG_TOTAL_TARGET_BITRATE_MAX;	if (h->params.vi_bitrate.target > MPEG_VIDEO_TARGET_BITRATE_MAX)		h->params.vi_bitrate.target = MPEG_VIDEO_TARGET_BITRATE_MAX;	if (h->params.vi_bitrate.max > MPEG_VIDEO_MAX_BITRATE_MAX)		h->params.vi_bitrate.max = MPEG_VIDEO_MAX_BITRATE_MAX;	if (h->params.au_bitrate.target <= 256)		h->params.au_bitrate.target = 256;	else		h->params.au_bitrate.target = 384;}static int saa6752hs_init(struct i2c_client* client){	unsigned char buf[9], buf2[4];	struct saa6752hs_state *h;	u32 crc;	unsigned char localPAT[256];	unsigned char localPMT[256];	h = i2c_get_clientdata(client);	/* Set video format - must be done first as it resets other settings */	buf[0] = 0x41;	buf[1] = h->video_format;	i2c_master_send(client, buf, 2);	/* Set number of lines in input signal */	buf[0] = 0x40;	buf[1] = 0x00;	if (h->standard & V4L2_STD_525_60)		buf[1] = 0x01;	i2c_master_send(client, buf, 2);	/* set bitrate */	saa6752hs_set_bitrate(client, &h->params);	/* Set GOP structure {3, 13} */	buf[0] = 0x72;	buf[1] = 0x03;	buf[2] = 0x0D;	i2c_master_send(client,buf,3);    	/* Set minimum Q-scale {4} */	buf[0] = 0x82;	buf[1] = 0x04;	i2c_master_send(client,buf,2);    	/* Set maximum Q-scale {12} */	buf[0] = 0x83;	buf[1] = 0x0C;	i2c_master_send(client,buf,2);    	/* Set Output Protocol */	buf[0] = 0xD0;	buf[1] = 0x81;	i2c_master_send(client,buf,2);    	/* Set video output stream format {TS} */	buf[0] = 0xB0;	buf[1] = 0x05;	i2c_master_send(client,buf,2);	/* compute PAT */	memcpy(localPAT, PAT, sizeof(PAT));	localPAT[17] = 0xe0 | ((h->params.ts_pid_pmt >> 8) & 0x0f);	localPAT[18] = h->params.ts_pid_pmt & 0xff;	crc = crc32_be(~0, &localPAT[7], sizeof(PAT) - 7 - 4);	localPAT[sizeof(PAT) - 4] = (crc >> 24) & 0xFF;	localPAT[sizeof(PAT) - 3] = (crc >> 16) & 0xFF;	localPAT[sizeof(PAT) - 2] = (crc >> 8) & 0xFF;	localPAT[sizeof(PAT) - 1] = crc & 0xFF;	/* compute PMT */	memcpy(localPMT, PMT, sizeof(PMT));	localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f);	localPMT[4] = h->params.ts_pid_pmt & 0xff;	localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F);	localPMT[16] = h->params.ts_pid_pcr & 0xFF;	localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F);	localPMT[21] = h->params.ts_pid_video & 0xFF;	localPMT[25] = 0xE0 | ((h->params.ts_pid_audio >> 8) & 0x0F);	localPMT[26] = h->params.ts_pid_audio & 0xFF;	crc = crc32_be(~0, &localPMT[7], sizeof(PMT) - 7 - 4);	localPMT[sizeof(PMT) - 4] = (crc >> 24) & 0xFF;	localPMT[sizeof(PMT) - 3] = (crc >> 16) & 0xFF;	localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF;	localPMT[sizeof(PMT) - 1] = crc & 0xFF;    	/* Set Audio PID */	buf[0] = 0xC1;	buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF;	buf[2] = h->params.ts_pid_audio & 0xFF;	i2c_master_send(client,buf,3);	/* Set Video PID */	buf[0] = 0xC0;	buf[1] = (h->params.ts_pid_video >> 8) & 0xFF;	buf[2] = h->params.ts_pid_video & 0xFF;	i2c_master_send(client,buf,3);	/* Set PCR PID */	buf[0] = 0xC4;	buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF;	buf[2] = h->params.ts_pid_pcr & 0xFF;	i2c_master_send(client,buf,3);	/* Send SI tables */	i2c_master_send(client,localPAT,sizeof(PAT));	i2c_master_send(client,localPMT,sizeof(PMT));	/* mute then unmute audio. This removes buzzing artefacts */	buf[0] = 0xa4;	buf[1] = 1;	i2c_master_send(client, buf, 2);	buf[1] = 0;	i2c_master_send(client, buf, 2);	/* start it going */	saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);	/* readout current state */	buf[0] = 0xE1;	buf[1] = 0xA7;	buf[2] = 0xFE;	buf[3] = 0x82;	buf[4] = 0xB0;	i2c_master_send(client, buf, 5);	i2c_master_recv(client, buf2, 4);	/* change aspect ratio */	buf[0] = 0xE0;	buf[1] = 0xA7;	buf[2] = 0xFE;	buf[3] = 0x82;	buf[4] = 0xB0;	buf[5] = buf2[0];	switch(h->params.vi_aspect_ratio) {	case V4L2_MPEG_ASPECT_16_9:		buf[6] = buf2[1] | 0x40;		break;	case V4L2_MPEG_ASPECT_4_3:	default:		buf[6] = buf2[1] & 0xBF;		break;		break;	}	buf[7] = buf2[2];	buf[8] = buf2[3];	i2c_master_send(client, buf, 9);	return 0;}static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind){	struct saa6752hs_state *h;	printk("saa6752hs: chip found @ 0x%x\n", addr<<1);	if (NULL == (h = kmalloc(sizeof(*h), GFP_KERNEL)))		return -ENOMEM;	memset(h,0,sizeof(*h));	h->client = client_template;	h->params = param_defaults;	h->client.adapter = adap;	h->client.addr = addr;	/* Assume 625 input lines */	h->standard = 0;	i2c_set_clientdata(&h->client, h);	i2c_attach_client(&h->client);	return 0;}static int saa6752hs_probe(struct i2c_adapter *adap){	if (adap->class & I2C_CLASS_TV_ANALOG)		return i2c_probe(adap, &addr_data, saa6752hs_attach);	return 0;}static int saa6752hs_detach(struct i2c_client *client){	struct saa6752hs_state *h;	h = i2c_get_clientdata(client);	i2c_detach_client(client);	kfree(h);	return 0;}static intsaa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg){	struct saa6752hs_state *h = i2c_get_clientdata(client);	struct v4l2_mpeg_compression *params = arg;	int err = 0;	switch (cmd) {	case VIDIOC_S_MPEGCOMP:		if (NULL == params) {			/* apply settings and start encoder */			saa6752hs_init(client);			break;		}		saa6752hs_set_params(client, params);		/* fall through */	case VIDIOC_G_MPEGCOMP:		*params = h->params;		break;	case VIDIOC_G_FMT:	{	   struct v4l2_format *f = arg;	   if (h->video_format == SAA6752HS_VF_UNKNOWN)		   h->video_format = SAA6752HS_VF_D1;	   f->fmt.pix.width =		   v4l2_format_table[h->video_format].fmt.pix.width;	   f->fmt.pix.height =		   v4l2_format_table[h->video_format].fmt.pix.height;	   break ;	}	case VIDIOC_S_FMT:	{		struct v4l2_format *f = arg;		saa6752hs_set_subsampling(client, f);		break;	}	case VIDIOC_S_STD:		h->standard = *((v4l2_std_id *) arg);		break;	default:		/* nothing */		break;	}	return err;}/* ----------------------------------------------------------------------- */static struct i2c_driver driver = {	.owner          = THIS_MODULE,	.name           = "i2c saa6752hs MPEG encoder",	.id             = I2C_DRIVERID_SAA6752HS,	.flags          = I2C_DF_NOTIFY,	.attach_adapter = saa6752hs_probe,	.detach_client  = saa6752hs_detach,	.command        = saa6752hs_command,};static struct i2c_client client_template ={	.name       = "saa6752hs",	.flags      = I2C_CLIENT_ALLOW_USE,	.driver     = &driver,};static int __init saa6752hs_init_module(void){	return i2c_add_driver(&driver);}static void __exit saa6752hs_cleanup_module(void){	i2c_del_driver(&driver);}module_init(saa6752hs_init_module);module_exit(saa6752hs_cleanup_module);/* * Overrides for Emacs so that we follow Linus's tabbing style. * --------------------------------------------------------------------------- * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -