Hi all,
I have refered to Camera Development section in NVIDIA Tegra Linux Driver Package Development Guide R32.1, to create a new camera based on IMX204.
Here are the steps:
-
Create a new .dtsi file for IMX421 camera inside Linux_for_Tegra/sources/hardware/platform/t19x/common/kernel-dts/t19x-common-modules (copy from Tegra194-camera-e3377-a00.dtsi for IMX204 with the update to new camera). They both share the same spi@c2600000 driver
-
update tegra194-camera-plugin-manager.dtsi with the new camera as below
/* E3377 camera board */
fragment-e3377@0 {
ids = "3377-1000-*";
override@0 {
target = <&e3377_cam0>;
_overlay_ {
status = "okay";
};
};
override@1 {
target = <&cam_module0>;
_overlay_ {
status = "okay";
badge = "e3377_rear_IMX204";
position = "rear";
orientation = "1";
};
};
override@2 {
target = <&cam_module0_drivernode0>;
_overlay_ {
status = "okay";
pcl_id = "v4l2_sensor";
devname = "imx204_spi";
proc-device-tree = "/proc/device-tree/spi@c260000/imx204@0";
};
};
/* Enable VI ports */
override@4 {
target = <&vi_base>;
_overlay_ {
num-channels=<1>;
};
};
override@5 {
target = <&vi_port0>;
_overlay_ {
status = "okay";
};
};
override@6 {
target = <&e3377_vi_in0>;
_overlay_ {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&e3377_slvs_ec_out0>;
};
};
/* Enable SLVS-EC ports */
override@8 {
target = <&slvs_ec_stream0>;
_overlay_ {
status = "okay";
};
};
override@9 {
target = <&slvs_ec_stream0_port0>;
_overlay_ {
status = "okay";
};
};
override@10 {
target = <&e3377_slvs_ec_in0>;
_overlay_ {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&e3377_imx204_out0>;
};
};
override@11 {
target = <&slvs_ec_stream0_port1>;
_overlay_ {
status = "okay";
};
};
override@12 {
target = <&e3377_slvs_ec_out0>;
_overlay_ {
status = "okay";
remote-endpoint = <&e3377_vi_in0>;
};
};
/* GPIO */
override@14 {
target = <&{/gpio@2200000}>;
_overlay_ {
camera-control-input {
status = "disabled";
};
camera-control-output-low {
gpio-hog;
gpios = <SLVS_CAM0_RST_L 0>;
label = "slvs-cam0-rst";
output-low;
status = "okay";
};
camera-control-output-high {
status = "disabled";
};
};
};
};
/* E3377IMX421 camera board */
fragment-imx421@0 {
ids = "imx421-1000-*";
override@0 {
target = <&imx421_cam0>;
_overlay_ {
status = "okay";
};
};
override@1 {
target = <&cam_module0>;
_overlay_ {
status = "okay";
badge = "imx421_rear_IMX421";
position = "rear";
orientation = "1";
};
};
override@2 {
target = <&cam_module0_drivernode0>;
_overlay_ {
status = "okay";
pcl_id = "v4l2_sensor";
devname = "imx421_spi";
proc-device-tree = "/proc/device-tree/spi@c260000/imx421@0";
};
};
/* Enable VI ports */
override@4 {
target = <&vi_base>;
_overlay_ {
num-channels=<1>;
};
};
override@5 {
target = <&vi_port0>;
_overlay_ {
status = "okay";
};
};
override@6 {
target = <&imx421_vi_in0>;
_overlay_ {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&imx421_slvs_ec_out0>;
};
};
/* Enable SLVS-EC ports */
override@8 {
target = <&slvs_ec_stream0>;
_overlay_ {
status = "okay";
};
};
override@9 {
target = <&slvs_ec_stream0_port0>;
_overlay_ {
status = "okay";
};
};
override@10 {
target = <&imx421_slvs_ec_in0>;
_overlay_ {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&imx421_imx421_out0>;
};
};
override@11 {
target = <&slvs_ec_stream0_port1>;
_overlay_ {
status = "okay";
};
};
override@12 {
target = <&imx421_slvs_ec_out0>;
_overlay_ {
status = "okay";
remote-endpoint = <&imx421_vi_in0>;
};
};
/* GPIO */
override@14 {
target = <&{/gpio@2200000}>;
_overlay_ {
camera-control-input {
status = "disabled";
};
camera-control-output-low {
gpio-hog;
gpios = <SLVS_CAM0_RST_L 0>;
label = "slvs-cam0-rst";
output-low;
status = "okay";
};
camera-control-output-high {
status = "disabled";
};
};
};
};
- Add the new camera .dtsi into …/galen/kernel-dts/common/tegra194-p2822-camera-modules.dtsi
- New files imx421.c and imx421.h created, and updated in kernel folder.
- Updated respective tegra_deconfig and Make file for new camera driver
Compilation success without failure, after flashing to target, there were few issues:
a. Could not locate imx421@0 folder inside sys/firmware/devicetree/base/spi@c260000, it contains only imx204@0 folder
b. imx421.h is not included inside usr/src/linux-headers-4.9.140-tegra-linux_x86_64/nvidia/include/media and other include folder for application usage.
Please share me how to fix the device tree problem if you have the solution. Thanks a lot!