Re: [PATCH 1/3] mx2_camera: Add soc_camera support for i.MX25/i.MX27

2010-05-17 Thread Sascha Hauer
On Wed, May 12, 2010 at 09:02:29PM +0200, Guennadi Liakhovetski wrote:
 Hi Baruch
 
 Thanks for eventually mainlining this driver! A couple of comments below. 
 Sascha, would be great, if you could get it tested on imx27 with and 
 without emma.

I will see what I can do. Testing and probably breathing life into a
camera driver usually takes me two days given that the platform support
is very outdated. I hope our customer is interested in this, then it
would be possible to test it.

 BTW, if you say, that you use emma to avoid using the 
 standard DMA controller, why would anyone want not to use emma? Resource 
 conflict? There is also a question for you down in the comments, please, 
 skim over.

I originally did not know how all the components should work together.
Now I think it's the right way to use the EMMA to be able to scale
images and to do colour conversions (which does not work with our Bayer
format cameras, so I cannot test it).

 
 On Thu, 6 May 2010, Baruch Siach wrote:
 
  This is the soc_camera support developed by Sascha Hauer for the i.MX27.  
  Alan
  Carvalho de Assis modified the original driver to get it working on more 
  recent
  kernels. I modified it further to add support for i.MX25. This driver has 
  only
  been tested on the i.MX25 platform.
  
  Signed-off-by: Baruch Siach bar...@tkos.co.il
  ---
   arch/arm/plat-mxc/include/mach/memory.h  |4 +-
   arch/arm/plat-mxc/include/mach/mx2_cam.h |   41 +
   drivers/media/video/Kconfig  |   14 +
   drivers/media/video/Makefile |1 +
   drivers/media/video/mx2_camera.c | 1396 
  ++
   5 files changed, 1454 insertions(+), 2 deletions(-)
   create mode 100644 arch/arm/plat-mxc/include/mach/mx2_cam.h
   create mode 100644 drivers/media/video/mx2_camera.c
  
  diff --git a/arch/arm/plat-mxc/include/mach/memory.h 
  b/arch/arm/plat-mxc/include/mach/memory.h
  index c4b40c3..5803836 100644
  --- a/arch/arm/plat-mxc/include/mach/memory.h
  +++ b/arch/arm/plat-mxc/include/mach/memory.h
  @@ -44,12 +44,12 @@
*/
   #define CONSISTENT_DMA_SIZE SZ_8M
   
  -#elif defined(CONFIG_MX1_VIDEO)
  +#elif defined(CONFIG_MX1_VIDEO) || defined(CONFIG_MX2_VIDEO)
   /*
* Increase size of DMA-consistent memory region.
* This is required for i.MX camera driver to capture at least four VGA 
  frames.
*/
   #define CONSISTENT_DMA_SIZE SZ_4M
  -#endif /* CONFIG_MX1_VIDEO */
  +#endif /* CONFIG_MX1_VIDEO || CONFIG_MX2_VIDEO */
   
   #endif /* __ASM_ARCH_MXC_MEMORY_H__ */
  diff --git a/arch/arm/plat-mxc/include/mach/mx2_cam.h 
  b/arch/arm/plat-mxc/include/mach/mx2_cam.h
  new file mode 100644
  index 000..01b3bdc
  --- /dev/null
  +++ b/arch/arm/plat-mxc/include/mach/mx2_cam.h
  @@ -0,0 +1,41 @@
  +/*
  +mx2-cam.h - i.MX27/i.MX25 camera driver header file
  +
  +Copyright (C) 2003, Intel Corporation
  +Copyright (C) 2008, Sascha Hauer s.ha...@pengutronix.de
  +Copyright (C) 2010, Baruch Siach bar...@tkos.co.il
  +
  +This program is free software; you can redistribute it and/or modify
  +it under the terms of the GNU General Public License as published by
  +the Free Software Foundation; either version 2 of the License, or
  +(at your option) any later version.
  +
  +This program is distributed in the hope that it will be useful,
  +but WITHOUT ANY WARRANTY; without even the implied warranty of
  +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  +GNU General Public License for more details.
  +
  +You should have received a copy of the GNU General Public License
  +along with this program; if not, write to the Free Software
  +Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 
  USA.
  +*/
 
 Please, follow the kernel multiline comment style:
 
 /*
  * this is a
  * multiline comment
  */
 
  +
  +#ifndef __MACH_MX2_CAM_H_
  +#define __MACH_MX2_CAM_H_
  +
  +#define MX2_CAMERA_SWAP16  (1  0)
  +#define MX2_CAMERA_EXT_VSYNC   (1  1)
  +#define MX2_CAMERA_CCIR(1  2)
  +#define MX2_CAMERA_CCIR_INTERLACE  (1  3)
  +#define MX2_CAMERA_HSYNC_HIGH  (1  4)
  +#define MX2_CAMERA_GATED_CLOCK (1  5)
  +#define MX2_CAMERA_INV_DATA(1  6)
  +#define MX2_CAMERA_PCLK_SAMPLE_RISING  (1  7)
  +#define MX2_CAMERA_PACK_DIR_MSB(1  8)
  +
  +struct mx2_camera_platform_data {
  +   unsigned long flags;
  +   unsigned long clk;
  +};
 
 Since this is an exported API, please, document this struct, at least 
 unsigned long clk is not self-explanatory, IMHO.
 
  +
  +#endif /* __MACH_MX2_CAM_H_ */
  diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
  index f8fc865..4e230b8 100644
  --- a/drivers/media/video/Kconfig
  +++ b/drivers/media/video/Kconfig
  @@ -949,6 +949,20 @@ config VIDEO_OMAP2
  ---help---
This is a v4l2 driver for the TI OMAP2 camera capture interface
   
  +config 

Re: Bug in AMDs V4L2 driver lxv4l2?

2010-05-17 Thread Mike Rapoport

Hi Daniel,

Daniel Borkmann wrote:

Hi everyone,

I am using an AMD Geode webcam with a V4L driver (lxv4l2). For the userspace 
I've implemented a V4L
binding with memory mapping of the frames. After sucessfull receiving frames it 
lasts about two or
three minutes and then either the timestamp of the frame is not changing 
anymore or a kernel oops
happens. I am not quite sure whether this is caused by my userspace test program 
(fw_singapore)
or whether this is a bug within AMDs driver code ...


I while ago I've done some work on the Geode LX V4L driver. It was not 
cleaned up enough to be submitted, but probably you'll find it useful.


http://compulab.co.il/workspace/mediawiki/index.php5?title=CM-iGLX:_Linux:_Video_Input_Port


Thanks for help.
Cheers,
Daniel

Here the causing driver function within AMDs lx.c (and below the dmesg output):

Nevertheless, I noticed that this function is also a potential deadlock 
candidate since
spin_lock_irqsave(io-lock, flags); is called an the else return 0; does 
not release the lock.


/** lx_capt_resume2 - queue capture buffers to vip */
int
lx_capt_resume2(VidDevice *dp,io_queue *io)
{
   io_buf *op, *ep;
   int eidx, oidx, vip_buffers;
   int task = dp-capt_vip_task;
   int task_buffers = vip_task_data[task].task_buffers;
   VIPINPUTBUFFER *vip_inpbfr = dp-vip_inpbfr;

   unsigned long flags;
   struct list_head *lp;
   io_buf *bp1;

   dp-capt_stalled = 1;
   task = dp-capt_vip_task;
   task_buffers = vip_task_data[task].task_buffers;

   if( dp-capt_addr_is_set == 0 ) {
  op = dp-capt_toggle == capt_toggle_odd ? dp-capt_elch : dp-capt_onxt;
  if( op == NULL ) {
 if( list_empty(io-rd_qbuf) != 0 )
 {
   // there are no more buffers into the input list for grabbing images,
   // so requeue first output buffer into input list

   spin_lock_irqsave(io-lock, flags);

   lp = io-rd_dqbuf;
   if( ! list_empty(lp) ) {
  bp1 = list_entry(lp-next,io_buf,bfrq);// get the struct for 
this entry / list_entry ( ptr, type, member) struct list_head pointer/ type of 
the struct this is embedded in/
name of the list_struct within the struct.
  list_del_init(bp1-bfrq); //deletes entry from list and 
reinitialize it
   }
   else return 0;

   lp = io-rd_qbuf;
   list_move_tail(bp1-bfrq,lp);

   bp1-sequence = io-sequence++;
   bp1-flags = ~V4L2_BUF_FLAG_DONE;
   bp1-flags |= V4L2_BUF_FLAG_QUEUED;

   if( dp-capt_stalled != 0 )
   {
  DMSG(3, v4l_qbfr : capt != 0  dp-capt_stalled != 
0\n);
  //v4l_capt_unstall(dp);
   }

   spin_unlock_irqrestore(io-lock,flags);
   //return 0;
 }

 op = list_entry(io-rd_qbuf.next,io_buf,bfrq);
 list_del_init(op-bfrq);
  }
  if( dp-capt_toggle == capt_toggle_both ||
  dp-capt_toggle == capt_toggle_odd ) {
 if( (ep=dp-capt_enxt) == NULL ) {
if( list_empty(io-rd_qbuf) != 0 ) {
   list_add(op-bfrq,io-rd_qbuf);
   return 0;
}
ep = list_entry(io-rd_qbuf.next,io_buf,bfrq);
list_del_init(ep-bfrq);
 }
  }
  else
  {
 ep = op;
  }
  dp-capt_onxt = op;  oidx = op-index;
  dp-capt_enxt = ep;  eidx = ep-index;
   }
   else
   {
  oidx = eidx = 0;
   }

   if( oidx != eidx ) {
  vip_inpbfr-current_buffer = eidx;
  vip_buffers = vip_task_data[task].vip_even_buffers;
  vip_toggle_video_offsets(vip_buffers,vip_inpbfr);
  vip_inpbfr-current_buffer = oidx;
  vip_buffers = vip_task_data[task].vip_odd_buffers;
  vip_toggle_video_offsets(vip_buffers,vip_inpbfr);
   }
   else {
  vip_inpbfr-current_buffer = oidx;
  vip_buffers = vip_task_data[task].vip_buffers;
  vip_toggle_video_offsets(vip_buffers,vip_inpbfr);
   }
   dp-capt_stalled = 0;

   ++dp-capt_sequence;
   ++dp-capt_jiffy_sequence;

   return 1;
}


dmesg and uname:


n...@purzel [1] [~]$ uname -a
Linux purzel 2.6.29.6-rt24-aldebaran-rt #1 PREEMPT RT Fri Feb 12 17:51:46 CET 
2010 i586 GNU/Linux

[   17.877211] AMD Linux LX video2linux/2 driver 3.2.0100
[   17.893218] Found Geode LX VIP at IRQ 11
[   17.910414] OmniVision ov7670 sensor driver, at your service (v 2.00)
[   17.939093] ov7670/1: driver attached: adapter id: 10002
[   17.955545] Trying to detect OmniVision 7670/7672 I2C adapters
[   19.847126] ov7670_init returned 0
[   19.847139] Phase 1
[   19.849429] Phase 2
[   19.849440] Phase 3
[   19.851728] Phase 4
[   19.851739] Phase 5
[   19.854054] Phase 6
[   19.854064] Phase 7
[   19.856357] Phase 8
[   19.856367] Phase 9
[   19.856377] OmniVision 7670/7671 I2C Found
[   19.868799] ov7670/1: driver attached: adapter id: 0
[   20.324975] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[   22.963201] spurious 8259A interrupt: IRQ7.
[   74.863542] warning: 

Re: [PATCH 1/3] mx2_camera: Add soc_camera support for i.MX25/i.MX27

2010-05-17 Thread Baruch Siach
Hi Sascha,

Thanks for your comments.

On Mon, May 17, 2010 at 09:27:20AM +0200, Sascha Hauer wrote:
 On Wed, May 12, 2010 at 09:02:29PM +0200, Guennadi Liakhovetski wrote:
  Hi Baruch
  
  Thanks for eventually mainlining this driver! A couple of comments below. 
  Sascha, would be great, if you could get it tested on imx27 with and 
  without emma.
 
 I will see what I can do. Testing and probably breathing life into a
 camera driver usually takes me two days given that the platform support
 is very outdated. I hope our customer is interested in this, then it
 would be possible to test it.
 
  BTW, if you say, that you use emma to avoid using the 
  standard DMA controller, why would anyone want not to use emma? Resource 
  conflict? There is also a question for you down in the comments, please, 
  skim over.
 
 I originally did not know how all the components should work together.
 Now I think it's the right way to use the EMMA to be able to scale
 images and to do colour conversions (which does not work with our Bayer
 format cameras, so I cannot test it).

So can I remove the non EMMA code from this driver? This will simplify the 
code quite a bit.

[snip]

   +static int mclk_get_divisor(struct mx2_camera_dev *pcdev)
   +{
   + dev_info(pcdev-dev, %s not implemented. Running at max speed\n,
   + __func__);
  
  Hm, why is this unimplemented?
  
   +
   +#if 0
   + unsigned int mclk = pcdev-pdata-clk_csi;
   + unsigned int pclk = clk_get_rate(pcdev-clk_csi);
   + int i;
   +
   + dev_dbg(pcdev-dev, %s: %ld %ld\n, __func__, mclk, pclk);
   +
   + for (i = 0; i  0xf; i++)
   + if ((i + 1) * 2 * mclk = pclk)
   + break;
  
  This doesn't look right. You increment the counter i, and terminate the
  loop as soon as (i + 1) * 2 * mclk = pclk. Obviously, if 2 * mclk = 
  pclk,
  this will terminate immediately, otherwise it will run until the end and
  return 0xf without satisfying the condition. What exactly are you trying to
  achieve? Find the _largest_ i, such that (i + 1) * 2 * mclk = pclk? Then
  why not just do i = pclk / 2 / mclk - 1?
  
   + return i;
   +#endif
   + return 0;
   +}

Can you shed some light on this?

Thanks,
baruch

-- 
 ~. .~   Tk Open Systems
=}ooO--U--Ooo{=
   - bar...@tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Stuck Digittrade DVB-T stick (dvb_usb_af9015)

2010-05-17 Thread marc balta
hi,

After the past days there has been no device crash anymore but another problem:

it seems after some time running the device (some hours) tuning takes longer 
and longer until it isnt  possible at all anymore to tune to some channels, 
although signal strength is sufficient: rmmoding and modprobing the driver 
(dvb_usb_af9015) solves the problem and tuning is fast on the same channel 
again.



Greetings,
Marc

--- Antti Palosaari cr...@iki.fi schrieb am Fr, 14.5.2010:

 Von: Antti Palosaari cr...@iki.fi
 Betreff: Re: Stuck Digittrade DVB-T stick (dvb_usb_af9015)
 An: marc balta marc_ba...@yahoo.de
 CC: linux-media@vger.kernel.org
 Datum: Freitag, 14. Mai, 2010 19:16 Uhr
 Terve
 
 On 05/14/2010 02:17 PM, marc balta wrote:
  would be nice because it is happening rather often :
 Every second or third day. Is there a way to reinit the
 device with a script wihtout restarting my server and
 without influencing other usb devices. If yes I could reinit
 the device say two minutes before every recording starts
 using a hook. This would solve my problems.
 
 I just added support for new firmware 5.1.0.0. Please test
 if it helps.
 http://linuxtv.org/hg/~anttip/af9015/
 http://palosaari.fi/linux/v4l-dvb/firmware/af9015/5.1.0.0/
 
 regards
 Antti
 -- http://palosaari.fi/
 


--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


KWorld Dual DVB-T USB (399U)

2010-05-17 Thread Josu Lazkano
Hello, I am looking for this tuner:
http://www.linuxtv.org/wiki/index.php/KWorld_USB_Dual_DVB-T_TV_Stick_(DVB-T_399U)

I am new on GNU/Linux, I want to use it on MythTV.

Can someone confirm that it works with both tuners? I read on some
forums that there are crashes when both tuners are working. The
linuxtv wiki is outdated.

Thanks and regards.

-- 
Josu Lazkano
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[cron job] v4l-dvb daily build 2.6.22 and up: ERRORS, 2.6.16-2.6.21: ERRORS

2010-05-17 Thread Hans Verkuil
This message is generated daily by a cron job that builds v4l-dvb for
the kernels and architectures in the list below.

Results of the daily build of v4l-dvb:

date:Mon May 17 19:00:21 CEST 2010
path:http://www.linuxtv.org/hg/v4l-dvb
changeset:   14859:8f5129efe974
git master:   f6760aa024199cfbce564311dc4bc4d47b6fb349
git media-master: 4fcfa8824391ef0f9cff82122067f31c6d920921
gcc version:  i686-linux-gcc (GCC) 4.4.3
host hardware:x86_64
host os:  2.6.32.5

linux-2.6.32.6-armv5: OK
linux-2.6.33-armv5: OK
linux-2.6.34-rc7-armv5: ERRORS
linux-2.6.32.6-armv5-davinci: OK
linux-2.6.33-armv5-davinci: OK
linux-2.6.34-rc7-armv5-davinci: ERRORS
linux-2.6.32.6-armv5-ixp: OK
linux-2.6.33-armv5-ixp: OK
linux-2.6.34-rc7-armv5-ixp: ERRORS
linux-2.6.32.6-armv5-omap2: OK
linux-2.6.33-armv5-omap2: OK
linux-2.6.34-rc7-armv5-omap2: ERRORS
linux-2.6.22.19-i686: ERRORS
linux-2.6.23.17-i686: ERRORS
linux-2.6.24.7-i686: ERRORS
linux-2.6.25.20-i686: ERRORS
linux-2.6.26.8-i686: ERRORS
linux-2.6.27.44-i686: ERRORS
linux-2.6.28.10-i686: ERRORS
linux-2.6.29.1-i686: ERRORS
linux-2.6.30.10-i686: WARNINGS
linux-2.6.31.12-i686: OK
linux-2.6.32.6-i686: OK
linux-2.6.33-i686: OK
linux-2.6.34-rc7-i686: ERRORS
linux-2.6.32.6-m32r: OK
linux-2.6.33-m32r: OK
linux-2.6.34-rc7-m32r: ERRORS
linux-2.6.32.6-mips: OK
linux-2.6.33-mips: OK
linux-2.6.34-rc7-mips: ERRORS
linux-2.6.32.6-powerpc64: OK
linux-2.6.33-powerpc64: OK
linux-2.6.34-rc7-powerpc64: ERRORS
linux-2.6.22.19-x86_64: ERRORS
linux-2.6.23.17-x86_64: ERRORS
linux-2.6.24.7-x86_64: ERRORS
linux-2.6.25.20-x86_64: ERRORS
linux-2.6.26.8-x86_64: ERRORS
linux-2.6.27.44-x86_64: ERRORS
linux-2.6.28.10-x86_64: ERRORS
linux-2.6.29.1-x86_64: ERRORS
linux-2.6.30.10-x86_64: WARNINGS
linux-2.6.31.12-x86_64: OK
linux-2.6.32.6-x86_64: OK
linux-2.6.33-x86_64: OK
linux-2.6.34-rc7-x86_64: ERRORS
linux-git-armv5: WARNINGS
linux-git-armv5-davinci: WARNINGS
linux-git-armv5-ixp: WARNINGS
linux-git-armv5-omap2: WARNINGS
linux-git-i686: WARNINGS
linux-git-m32r: OK
linux-git-mips: OK
linux-git-powerpc64: OK
linux-git-x86_64: WARNINGS
spec: ERRORS
spec-git: OK
sparse: ERRORS
linux-2.6.16.62-i686: ERRORS
linux-2.6.17.14-i686: ERRORS
linux-2.6.18.8-i686: ERRORS
linux-2.6.19.7-i686: ERRORS
linux-2.6.20.21-i686: ERRORS
linux-2.6.21.7-i686: ERRORS
linux-2.6.16.62-x86_64: ERRORS
linux-2.6.17.14-x86_64: ERRORS
linux-2.6.18.8-x86_64: ERRORS
linux-2.6.19.7-x86_64: ERRORS
linux-2.6.20.21-x86_64: ERRORS
linux-2.6.21.7-x86_64: ERRORS

Detailed results are available here:

http://www.xs4all.nl/~hverkuil/logs/Monday.log

Full logs are available here:

http://www.xs4all.nl/~hverkuil/logs/Monday.tar.bz2

The V4L-DVB specification from this daily build is here:

http://www.xs4all.nl/~hverkuil/spec/media.html
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: AF9015 suspend problem

2010-05-17 Thread Jose Alberto Reguero
El Viernes, 14 de Mayo de 2010, Antti Palosaari escribió:
 On 05/14/2010 03:50 AM, Jose Alberto Reguero wrote:
  El Jueves, 13 de Mayo de 2010, Antti Palosaari escribió:
  Terve!
  
  On 05/02/2010 06:39 PM, Jose Alberto Reguero wrote:
  When I have a af9015 DVB-T stick plugged I can not recover from pc
  suspend. I must unplug the stick to suspend work. Even if I remove the
  modules I cannot recover from suspend.
  Any idea why this happen?
  
  Did you asked this 7 months ago from me?
  I did some tests (http://linuxtv.org/hg/~anttip/suspend/) and looks like
  it is firmware loader problem (fw loader misses something or like
  that...). No one answered when I asked that from ML, but few weeks ago I
  saw some discussion. Look ML archives.
  
  regards
  Antti
  
  I think that is another problem. If I blacklist the af9015 driver and
  have the stick plugged in, the suspend don't finish, and the system
  can't resume. If I unplugg the stick the suspend feature work well.
 
 Look these and check if it is same problem:
 
 DVB USB resume from suspend crash
 http://www.mail-archive.com/linux-media@vger.kernel.org/msg09974.html
 
 Re: tuner XC5000 race condition??
 http://www.mail-archive.com/linux-media@vger.kernel.org/msg18012.html
 
 Bug 15294 -  Oops due to an apparent race between udev and a timeout in
 firmware_class.c
 https://bugzilla.kernel.org/show_bug.cgi?id=15294
 
 I haven't examined those yet, but I think they could be coming from same
 issue.
 
 br,
 Antti

I found my problem. Was a quirk that I have in the kernel parameters:
usbhid.quirks=0x07ca:0xa815:0x04
Without the quirk, the system go to sleep an can wake, although only the first 
time. The second time the system don't sleep. Perhaps I have some wrong in my 
scripts.

Jose Alberto

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PULL] http://linuxtv.org/hg/~dougsland/v4l-dvb

2010-05-17 Thread Douglas Schilling Landgraf
Hello,

On Fri, May 14, 2010 at 12:54 AM, Douglas Schilling Landgraf
dougsl...@gmail.com wrote:
 Hello Mauro,

      Please pull from http://linuxtv.org/hg/~dougsland/v4l-dvb for
 the following:

 - ir-core-priv.h: error: field 'rx_work' has incomplete type

Added:

   - cx231xx.h: Add include media/ir-kbd-i2c.h

Thanks
Douglas
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: 2.6.29 additional build errors

2010-05-17 Thread Douglas Schilling Landgraf
Hello Samuel,

2010/5/15 Samuel Rakitničan samuel.rakitni...@gmail.com:
 Additional build errors found after disabling the non building modules
 on todays mercurial tree.

Please update your local repository:

$ hg pull -u
$ make distclean
$ make

Now should work.

Thanks for your report.

Cheers
Douglas
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html