Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
Commits
7312bff3
Commit
7312bff3
authored
Aug 01, 2008
by
吴智聪(John Wu)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tvp7000 driver works in 480p input mode
parent
bad3fa56
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
163 additions
and
38 deletions
+163
-38
drivers/media/video/tvp7000.c
drivers/media/video/tvp7000.c
+163
-38
No files found.
drivers/media/video/tvp7000.c
View file @
7312bff3
...
...
@@ -51,6 +51,7 @@
(sizeof(x) / sizeof(*x))
#define STD(x) \
((x) < TOTAL_STANDARD ? video_std + (x) : NULL)
#define TVP7000_I2C_RETRY 3
/* I2C Addresses to scan */
static
unsigned
short
normal_i2c
[]
=
{
...
...
@@ -73,6 +74,126 @@ struct i2c_reg_value
u8
value
;
};
static
const
struct
i2c_reg_value
tvp7000_init_component
[]
=
{
{
/* 0x01 */
TVP7000_PLL_DIVIDE_MSB
,
0x6b
},
{
/* 0x02 */
TVP7000_PLL_DIVIDE_LSB
,
0x40
},
{
/* 0x03 */
TVP7000_PLL_CTRL
,
0x68
},
{
/* 0x04 */
TVP7000_PHASE_SELECT
,
0xb1
},
{
/* 0x05 */
TVP7000_CLAMP_START
,
0x06
},
{
/* 0x06 */
TVP7000_CLAMP_WIDTH
,
0x10
},
{
/* 0x07 */
TVP7000_HSYNC_OUTPUT_WIDTH
,
0x60
},
{
/* 0x08 */
TVP7000_BLUE_FINE_GAIN
,
0x80
},
{
/* 0x09 */
TVP7000_GREEN_FINE_GAIN
,
0x80
},
{
/* 0x0A */
TVP7000_RED_FINE_GAIN
,
0x80
},
{
/* 0x0B */
TVP7000_BLUE_FINE_OFFSET
,
0x80
},
{
/* 0x0C */
TVP7000_GREEN_FINE_OFFSET
,
0x80
},
{
/* 0x0D */
TVP7000_RED_FINE_OFFSET
,
0x80
},
{
/* 0x0E */
TVP7000_SYNC_CTRL_1
,
0x20
},
{
/* 0x0F */
TVP7000_PLL_CLAMP_CTRL
,
0x2E
},
{
/* 0x10 */
TVP7000_SYNC_ON_GREEN
,
0x85
},
{
/* 0x11 */
TVP7000_SYNC_SEPARATOR
,
0x47
},
{
/* 0x12 */
TVP7000_PRE_COAST
,
0x03
},
{
/* 0x13 */
TVP7000_POST_COAST
,
0x0c
},
{
/* 0x15 */
TVP7000_OUTPUT_FORMATTER
,
0x02
},
{
/* 0x16 */
TVP7000_TEST_REG
,
0x25
},
{
/* 0x19 */
TVP7000_INPUT_MUX_1
,
0x00
},
{
/* 0x1A */
TVP7000_INPUT_MUX_2
,
0x85
},
{
/* 0x1B */
TVP7000_BLUE_GREEN_GAIN
,
0x55
},
{
/* 0x1C */
TVP7000_RED_COARSE_GAIN
,
0x05
},
{
/* 0x1D */
TVP7000_FINE_OFFSET_LSB
,
0x00
},
{
/* 0x1E */
TVP7000_BLUE_COARSE_OFFSET
,
0x1f
},
{
/* 0x1F */
TVP7000_GREEN_COARSE_OFFSET
,
0x1f
},
{
/* 0x20 */
TVP7000_RED_COARSE_OFFSET
,
0x1f
},
{
/* 0x21 */
TVP7000_HSOUT_OUTPUT_START
,
0x08
},
{
/* 0x22 */
TVP7000_MISC_CTRL
,
0x08
},
{
/* 0x26 */
TVP7000_AUTO_CTRL_ENABLE
,
0x80
},
{
/* 0x28 */
TVP7000_AUTO_CTRL_FILTER
,
0x03
},
{
/* 0x2A */
TVP7000_FINE_CLAMP_CTRL
,
0x07
},
{
/* 0x2B */
TVP7000_POWER_CTRL
,
0x00
},
{
/* 0x2C */
TVP7000_ADC_SETUP
,
0x50
},
{
/* 0x2D */
TVP7000_COARSE_CLAMP_CTRL_1
,
0x00
},
{
/* 0x2E */
TVP7000_SOG_CLAMP
,
0x80
},
{
/* 0x31 */
TVP7000_ALC_PLACEMENT
,
0x00
},
};
static
const
struct
i2c_reg_value
tvp7000_init_default
[]
=
{
{
/* 0x01 */
TVP7000_PLL_DIVIDE_MSB
,
0x69
...
...
@@ -397,13 +518,9 @@ static int tvp7000_detach_client(struct i2c_client *client);
static
int
tvp7000_detect_client
(
struct
i2c_adapter
*
adapter
,
int
addr
,
int
kind
);
static
void
tvp7000_device_power_on
(
bool
on
);
static
inline
int
tvp7000_read_reg
(
u8
reg
);
static
inline
int
tvp7000_write_reg
(
u8
reg
,
u8
value
);
static
int
tvp7000_write_inittab
(
const
struct
i2c_reg_value
*
regs
,
int
num
);
static
int
tvp7000_setup_video_stardard
(
const
struct
tvp7000_video_std
*
std
);
static
int
tvp7000_device_init
(
struct
vpfe_capture_params
*
params
);
...
...
@@ -566,15 +683,6 @@ static int tvp7000_selmux(void)
return
0
;
}
static
void
tvp7000_reset
(
void
)
{
/* Initializes TVP7000 to its default values */
tvp7000_write_inittab
(
tvp7000_init_default
,
NUM_OF_REGS
(
tvp7000_init_default
));
/* Selects decoder input */
tvp7000_selmux
();
}
static
int
input_signal_exist
(
void
)
{
int
val
;
...
...
@@ -593,7 +701,7 @@ static int tvp7000_device_cmd(u32 cmd, void *arg)
switch
(
cmd
)
{
case
0
:
case
VIDIOC_INT_RESET
:
tvp7000_
reset
(
);
tvp7000_
device_init
(
NULL
);
break
;
case
VIDIOC_G_INPUT
:
{
...
...
@@ -608,16 +716,13 @@ static int tvp7000_device_cmd(u32 cmd, void *arg)
int
input
=
*
(
int
*
)
arg
;
if
(
input
==
VPFE_AMUX_COMPONENT
)
{
if
(
tvp7000_
selmux
(
))
if
(
tvp7000_
device_init
(
NULL
))
ret
=
-
EBUSY
;
}
else
ret
=
-
EINVAL
;
break
;
}
case
VIDIOC_S_STD
:
tvp7000_setup_video_stardard
(
STD
(
VIDEO480P60HZ
));
break
;
case
VPFE_CMD_CONFIG_CAPTURE
:
{
struct
vpfe_capture_params
*
params
=
...
...
@@ -625,8 +730,7 @@ static int tvp7000_device_cmd(u32 cmd, void *arg)
if
(
params
->
amuxmode
==
VPFE_AMUX_COMPONENT
)
{
tvp7000_selmux
();
//tvp7000_set_std(params->mode);
ret
=
tvp7000_setup_video_stardard
(
STD
(
VIDEO480P60HZ
));
}
else
ret
=
-
1
;
...
...
@@ -643,24 +747,32 @@ static int tvp7000_device_init(struct vpfe_capture_params *params)
u8
ver
=
0
;
FN_IN
;
ver
=
tvp7000_read_reg
(
TVP7000_CHIP_REVISION
);
DPRINTK
(
"TVP7000 detect! Revision: %d
\n
"
,
ver
);
DPRINTK
(
"TVP7000 detect! Revision: %d
\n
"
,
ver
);
/* initialize TVP7000 as its default values */
tvp7000_write_inittab
(
tvp7000_init_default
,
NUM_OF_REGS
(
tvp7000_init_default
));
tvp7000_write_inittab
(
tvp7000_init_component
,
NUM_OF_REGS
(
tvp7000_init_component
));
if
(
tvp7000_selmux
())
return
-
1
;
return
0
;
}
static
int
tvp7000_device_active
(
void
)
{
tvp7000_device_power_on
(
true
);
return
0
;
}
//tvp7000_write_reg(TVP7000_PLL_DIVIDE_MSB, 0x6B);
//tvp7000_write_reg(TVP7000_PLL_DIVIDE_LSB, 0x40);
//tvp7000_write_reg(TVP7000_PLL_CTRL, 0x68);
//tvp7000_write_reg(TVP7000_PHASE_SELECT, 0xB9);
// tvp7000_write_reg(TVP7000_SYNC_ON_GREEN, 0x80);
//tvp7000_write_reg(TVP7000_PRE_COAST, 0x03);
//tvp7000_write_reg(TVP7000_POST_COAST, 0x0C);
tvp7000_write_reg
(
TVP7000_MISC_CTRL
,
(
1
<<
3
)
|
(
1
<<
1
));
tvp7000_write_reg
(
TVP7000_SOG_CLAMP
,
1
<<
7
);
static
int
tvp7000_device_deactive
(
void
)
{
tvp7000_device_power_on
(
false
);
return
0
;
}
static
int
tvp7000_device_cleanup
(
void
)
{
/* do nothing */
return
0
;
}
...
...
@@ -669,22 +781,34 @@ static struct vpfe_capture_device tvp7000_capture_device = {
.
id
=
VPFE_CAPTURE_ID_TVP7000
,
.
capture_device_init
=
tvp7000_device_init
,
.
capture_device_cmd
=
tvp7000_device_cmd
,
.
capture_device_active
=
tvp7000_device_active
,
.
capture_device_deactive
=
tvp7000_device_deactive
,
.
capture_device_cleanup
=
tvp7000_device_cleanup
,
};
static
__init
int
tvp7000_init
(
void
)
{
int
i
;
int
err
=
0
;
FN_IN
;
/* power on the tvp7000 Video decoder*/
tvp7000_device_power_on
(
true
);
mdelay
(
500
);
err
=
i2c_add_driver
(
&
tvp7000_driver
);
if
(
err
)
{
DPRINTK
(
"I2C driver %s add failed
\n
"
,
tvp7000_driver
.
driver
.
name
);
return
err
;
}
for
(
i
=
0
;
i
<
TVP7000_I2C_RETRY
;
i
++
)
{
err
=
i2c_add_driver
(
&
tvp7000_driver
);
if
(
!
err
)
{
break
;
}
}
if
(
err
)
{
DPRINTK
(
"I2C driver %s add failed
\n
"
,
tvp7000_driver
.
driver
.
name
);
return
err
;
}
err
=
vpfe_capture_device_register
(
&
tvp7000_capture_device
);
if
(
err
)
{
...
...
@@ -692,6 +816,7 @@ static __init int tvp7000_init(void)
tvp7000_capture_device
.
name
);
return
err
;
}
tvp7000_device_power_on
(
false
);
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment